当类有operator()时的结构特化

时间:2015-12-09 18:36:15

标签: c++ templates c++11 metaprogramming template-specialization

当传递的类型有operator()(函子或lambda函数)时,我想专门化一个结构。目前,我有这段代码:

#include <iostream>
#include <type_traits>

template <class...>
struct mystruct: std::false_type {};

template <class C> 
struct mystruct<C, decltype(&C::operator())>: std::true_type {};

int main() {
    int n = 42;
    auto lambda = [&n](int i){return i + n;};

    // Should return false: OK
    std::cout<<mystruct<decltype(x)>::value<<std::endl;

    // Should return true: problem
    std::cout<<mystruct<decltype(lambda)>::value<<std::endl; 

    return 0;
}

如何让它发挥作用?

奖金问题:即使operator()受到保护或私有,如何使其有效?

1 个答案:

答案 0 :(得分:2)

这适用于void_t技术:

template <class, class = std::void_t<>>
struct mystruct: std::false_type {};

template <class C> 
struct mystruct<C, std::void_t<decltype(&C::operator())>>: std::true_type {};

虽然{C} 17之后void_t仅在库中,但很容易添加到您自己的实用程序库中。

有关红利问题,请参阅Detect existence of private member