我简化了 solution here帮助我确定一个类是否有成员函数:
template<typename T>
struct HasTest{
template<typename R, typename S = decltype(declval<R>().test())> static true_type Test(R*);
template<typename R> static false_type Test(...);
using def = decltype(Test<T>(0));
};
我需要使用 HasTest<T>::def::value
在 conditional_t
的情况下.问题是我必须用相当多的函数来做这个,因为我需要为每个函数声明一个结构,我希望找到一种方法来做 Substitution Fail Is Not An Error(SFINAE)条件内。像这样的东西:
conditional_t<struct { template<typename R, typename S = decltype(declval<R>().test())> static true_type Test(R*); template<typename R> static false_type Test(...); using def = decltype(Test<T>(0)); }::def, true_type, false_type>
该示例显然无法编译,但希望它能使我想做的事情变得清晰。
现在我必须为我计划在 namespace details
中测试的每个方法设置一个结构然后在我的 conditional_t
中使用它们.这引入了污染并将 SFINAE 的内部工作与 conditional_t
分开。它用于。
C++14/17 是否为我提供了另一种方法来执行此操作,或者我是否有办法声明和使用匿名 struct
在conditional_t
条件?
我创建了一个简单的测试 here欢迎您试用。
最佳答案
根据标准草案N4582 §14.1/p2 模板参数 [temp.param] (强调我的):
A storage class shall not be specified in a template-parameter declaration. Types shall not be defined in a template-parameter declaration.
因此,你不能有类似的东西:
conditional_t<bool, struct Foo {...}>
坦率地说,我没有找到允许在 C++ 中使用此类构造的充分理由,如果它们是未命名的类(例如,考虑重整问题)则更是如此。
关于c++ - 模板 SFINAE 在 conditional_t 内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37074561/