如何获得提供const重载的函数类型?

时间:2016-04-26 21:10:40

标签: c++ templates

我们说我有以下课程:

class C
{
public:
    void f( int ) {}
    void f( int ) const {}
};

f的两个重载之间的唯一区别是其中一个是const。我无法使用decltype( &C::f ),因为仍然存在歧义。

我想通过使用traits类来获取函数信息,所以我需要提供函数类型。

1 个答案:

答案 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函数。)