c++ - 模板 SFINAE 在 conditional_t 内

标签 c++ conditional-statements metaprogramming sfinae anonymous-class

我简化了 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 是否为我提供了另一种方法来执行此操作,或者我是否有办法声明和使用匿名 structconditional_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/

相关文章:

c++ - 将 ifstream 拆分为 n 个流?

c++ - 通过引用传递带有枚举类的枚举

c++ - 如何 std::bind() 创建数据成员?

c++ - 从 boost::signals2 安全断开连接

c - C 结构中的运行时条件字段

perl - 我应该使用 Perl 的条件吗? : operator as a switch/case statement or instead of if elsif?

c++ - 如何在本身取决于另一个条件的条件下使用 std::enable_if?

python - 用 X 相邻值的平均值替换 Numpy 数组中大于阈值的所有元素

c++ - 检查参数包是否包含类型

templates - 编程语言中的元函数和元类是什么意思?