模板SFINAE在conditional_t内
Template SFINAE Within conditional_t
我在这里简化了解决方案,以帮助我确定类是否具有成员函数:
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));
};
我需要在conditional_t
的条件下使用HasTest<T>::def::value
。问题是,我必须用相当多的函数来实现这一点,由于我需要为每个函数声明一个结构,我希望找到一种方法来在条件中实现替换失败不是错误(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是否为我提供了一种替代方法,或者有没有一种方法可以让我在conditional_t
条件中声明和使用匿名struct
?
我在这里创建了一个简单的测试,欢迎您尝试。
根据标准草案N4582§14.1/p2模板参数[temp.param](强调矿):
不应在模板参数中指定存储类声明类型不应在模板参数中定义声明
因此,你不可能有这样的东西:
conditional_t<bool, struct Foo {...}>
坦率地说,我找不到在C++中允许这样的构造的好理由,即使它们是未命名的类(例如,想想混乱的问题)。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 如何使用模板函数的函数签名进行SFINAE
- 数据成员SFINAE的C++17测试:gcc vs clang
- 使用在用于SFINAE的void_t中具有参数的方法
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- 提供与TMP和SFINAE的通用接口
- "Inverse SFINAE"避免模棱两可的过载
- C++中是否存在 std::conditional 的懒惰等价物?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 如何在儿童类中使用SFINAE
- 使用 SFINAE 作为模板参数的编译时递归
- 使用 SFINAE 设计模板方法
- 与SFINAE支票交朋友
- C++许多 SFINAE 风格的过载
- 是否可以混合使用SFINAE和模板专业化?
- C++表达SFINAE和ostream操纵器
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- SFINAE不能防止模棱两可的操作员过载吗?
- SFINAE是否取决于类型推断?