我有以下代码:
template <class Ret>
class Foo
{
public:
template <class T>
void foo(T&, const std::function<Ret()>&)
{
std::cout << "std::function<Ret()>\n";
}
template <class T>
void foo(T&, Ret(T::*)() const)
{
std::cout << "Ret(T::*)() const\n";
}
template <class T>
void foo(T&, Ret(T::*)())
{
std::cout << " Ret(T::*)()\n";
}
};
class A
{
public:
void foo1() const
{
}
void foo()
{
}
};
int main()
{
A a;
Foo<void> f;
f.foo(a, &A::foo);
f.foo(a, &A::foo1);
f.foo(a, std::bind(&A::foo, a));
}
它工作得很好,但我不想让常量和非常量成员函数指针有两个不同的函数。所以问题是:有没有办法将void foo(T&, const std::function<Ret()>&)
和void foo(T&, Ret(T::*)() const)
合并到一个函数中?请注意,存在std::function
重载,它也应该参与合并后的解析。我需要一些函数,它将只接受成员函数指针。而所有其他版本都将升级到std::function
版本。
发布于 2012-04-18 16:11:52
你似乎在问一个隐含的问题和一个明确的问题。您隐含的问题“如何合并常量和非常量版本”的答案如下
template<typename T, typename U, typename enable_if<is_fuction<T>::value, int>::type = 0>
void takesboth(T U::*);
https://stackoverflow.com/questions/10205248
复制相似问题