模板SFINAE在conditional_t内

Template SFINAE Within conditional_t

本文关键字:conditional SFINAE 模板      更新时间:2023-10-16

我在这里简化了解决方案,以帮助我确定类是否具有成员函数:

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++中允许这样的构造的好理由,即使它们是未命名的类(例如,想想混乱的问题)。