c++ - 将指向成员函数的指针传递给模板

标签 c++ c++11 templates metaprogramming c++17

我想知道如何将指向非静态成员函数的指针传递到模板中? 这是简化的代码:

template<typename, typename>
struct contains;

template<typename T, typename R, typename... Ts>
struct contains<T, R(Ts...)>
{
    static constexpr bool result = std::disjunction_v<std::is_same<T, Ts>...>;
};

class A
{
public:
    static void staticFoo(int a, double* b) {}
    void foo(int a, double* b) {}
};
void foo(int a, double* b) {}

int main ()
{
    //ok, this works
    std::cout << std::boolalpha << contains<double*, decltype(foo)>::result;
    //this too
    std::cout << std::boolalpha << contains<double*, std::remove_pointer_t<decltype(&A::staticFoo)>>::result;
    //boom, error
    std::cout << std::boolalpha << contains<double*, decltype(&A::foo)>::result;

    return 0;
}

执行这段代码,我得到一个错误:

 incomplete type 'contains<double*, void (A::*)(int, double*)>' used in nested name specifier

据我了解,类型是:

void(int, double*)
void(*)(int, double*)
void(A::*)(int, double*)

在第二种情况下,我可以使用 std::remove_pointer_t,但在第三种情况下,如何从函数签名中删除 (A::*)

最佳答案

您可以添加其他专业:

template<typename, typename> struct contains;

template<typename T, typename R, typename... Ts>
struct contains<T, R(Ts...)>
{
    static constexpr bool result = std::disjunction_v<std::is_same<T, Ts>...>;
};

template<typename T, typename R, typename... Ts>
struct contains<T, R (*)(Ts...)> : contains<T, R(Ts...)>
{
};

template<typename T, typename C, typename R, typename... Ts>
struct contains<T, R (C::*)(Ts...)> : contains<T, R(Ts...)>
{
};

// And even more for R (C::*) (Ts... ...) const volatile &&

然后

int main ()
{
    std::cout << std::boolalpha << contains<double*, decltype(foo)>::result;
    std::cout << std::boolalpha << contains<double*, decltype(&A::staticFoo)>::result;
    std::cout << std::boolalpha << contains<double*, decltype(&A::foo)>::result;
}

关于c++ - 将指向成员函数的指针传递给模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51087885/

相关文章:

c++ - 我怎么知道临时对象何时被创建和销毁?

c++ - 在 Linux x64 下使用 libmozjs-52 (SpiderMonkey) 的段错误

c++ - 为什么我们必须在箭头符号( -> )之后再次指定数据类型

c++ - 在循环初始化中使用 constexpr 和 static?

c++ - 修复第三方代码 : "error: ‘enable_if’ in namespace ‘std’ does not name a template type"

c++ - 在类中的函数外部归档 vector

c++ - map 中的循环迭代器

c++ - 类模板化成员函数和返回类型推断

C++函数转换题

C++,如何更新文本文件中的文本?