C++ 泛型`Is_enabled`SFINAE结构
我的目标是实现一个结构模板,该模板可用于检测模板替换是否格式正确或是否会失败。用法的一个示例是根据模板参数是否具有可比性提供两个版本的模板函数 如果显式地为每个场景提供结构,例如模板类型是否存在相等运算符,则可以很容易地解决此问题,如图所示。但是我没有实现一个可以接受(几乎)任意构造作为模板参数的结构 到目前为止,我达到的“最佳”方法是使用模板参数。它可以编译,但不适合参数替换格式良好的情况C++ 泛型`Is_enabled`SFINAE结构,c++,templates,sfinae,C++,Templates,Sfinae,我的目标是实现一个结构模板,该模板可用于检测模板替换是否格式正确或是否会失败。用法的一个示例是根据模板参数是否具有可比性提供两个版本的模板函数 如果显式地为每个场景提供结构,例如模板类型是否存在相等运算符,则可以很容易地解决此问题,如图所示。但是我没有实现一个可以接受(几乎)任意构造作为模板参数的结构 到目前为止,我达到的“最佳”方法是使用模板参数。它可以编译,但不适合参数替换格式良好的情况 #包括 #包括 模板 使用Enable=T; 模板 使用Enable_if=typename std::
#包括
#包括
模板
使用Enable=T;
模板
使用Enable_if=typename std::Enable_if::type;
模板
结构已启用:std::false\u类型{};
模板
结构已启用:std::true\u类型{};
///构造的一个例子
模板
使用Equals=decltype(std::declval()==std::declval());
模板
使用Enabled_eq=Enable_if;
模板
使用禁用的_eq=启用_if::value>;
模板
已启用\u eq foo()
{
std::cerr第三个模板参数是启用的
默认为void
。这是编译器将在是启用的
实例化中使用的。也就是说,是启用的:std::true\u type{}只有当Enable
的计算结果为void
时,才能使用。方法是将模板参数X
显式传递给类模板Enable
声明为:
template <typename T = void, typename...>
using Enable = T;
这也被称为。第三个模板参数是启用的
默认为void
。这是编译器将在是启用的
实例化中使用的。也就是说,是启用的:std::true\u type{}只有当Enable
的计算结果为void
时,才能使用。方法是将模板参数X
显式传递给类模板Enable
声明为:
template <typename T = void, typename...>
using Enable = T;
这也被称为。使用Enable=void;
,也就是说,void
不是T
它确实解决了我的问题。有人能给我解释一下为什么使用Enable=T
的解决方案不能像我预期的那样工作吗?使用Enable=void;
,也就是说,void
不是T
它确实解决了我的问题问题。有人能给我解释一下为什么使用Enable=T
的解决方案不能像我预期的那样工作吗?