class 具有 operator() 时的结构特化
Structure specialization when the class has an operator()
当传递的类型具有 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()
受保护或私有,如何让它工作?
这将是对 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 {};
虽然void_t
仅在C++17以后的库中,但很容易添加到您自己的实用程序库中。
关于奖金问题,请参阅 。
当传递的类型具有 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()
受保护或私有,如何让它工作?
这将是对 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 {};
虽然void_t
仅在C++17以后的库中,但很容易添加到您自己的实用程序库中。
关于奖金问题,请参阅