Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 泛型`Is_enabled`SFINAE结构_C++_Templates_Sfinae - Fatal编程技术网

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
的解决方案不能像我预期的那样工作吗?