我们说我有以下课程:
class C
{
public:
void f( int ) {}
void f( int ) const {}
};
f
的两个重载之间的唯一区别是其中一个是const
。我无法使用decltype( &C::f )
,因为仍然存在歧义。
我想通过使用traits类来获取函数信息,所以我需要提供函数类型。
答案 0 :(得分:6)
您可以通过将const
传递给期望指向非C::f
成员函数的指针的函数来强制选择非&C::f
const
重载。好的,
template <class C, class Ret, class... Args>
// trailing return type can be omitted in C++14
constexpr auto g(Ret (C::*p)(Args...)) -> decltype(p) {
return p;
}
static_assert(std::is_same<void (C::*)(int), decltype(g(&C::f))>::value, "wrong overload");
(请注意,如果要支持,还需要完成其他工作:C风格的可变参数函数,volatile
- 限定函数或ref-qualified函数。)