Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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++ 基于静态constexpr变量的SFINAE/requires_C++ - Fatal编程技术网

C++ 基于静态constexpr变量的SFINAE/requires

C++ 基于静态constexpr变量的SFINAE/requires,c++,C++,我试图了解SFINAE的一些高级用法,以及如何用不断发展的概念取代它,并点击以下示例: 结构A{ 静态constexpr bool为开=假; 使用T=void; //让我们尝尝斯菲那 模板 空f(T&T){} //也许它需要成为sfinae的本地参数才能启动? 模板 空f(T&T){} //让我们试试约束 模板需要打开 空f(T&T){} //可能是静态成员的问题?让我们硬编码 模板要求为false 空f(T&T){} //也许布尔值是个问题? 模板要求( uint8(是否打开)!=0 ) 空f

我试图了解SFINAE的一些高级用法,以及如何用不断发展的概念取代它,并点击以下示例:

结构A{ 静态constexpr bool为开=假; 使用T=void; //让我们尝尝斯菲那 模板 空f(T&T){} //也许它需要成为sfinae的本地参数才能启动? 模板 空f(T&T){} //让我们试试约束 模板需要打开 空f(T&T){} //可能是静态成员的问题?让我们硬编码 模板要求为false 空f(T&T){} //也许布尔值是个问题? 模板要求( uint8(是否打开)!=0 ) 空f(T&T){} //也许它必须依赖于某个即时模板参数? 模板要求( uint8_t(是否打开)*(大小…(参数)+1)!=0 ) 空f(T&T){} }; 我正在尝试基于该类型的某些属性启用/禁用函数。由于
void&
substitution失败,上述函数实际上都没有按我预期的方式工作,每次都会抛出编译错误

我能让它工作的唯一方法是:

模板
空f(LT&t){}
但这也有其自身的问题,即我正在解决的更广泛的问题(本质上,它只是检查
t
是否可替代,并忽略
是开放的
成员),IMO不是重点,因为我认为
typename LT=t
首先是一种黑客行为


是否有可能在某种程度上不在替换上出错(我认为SFINAE的要点是什么)或者不在第一位置替换(我认为要求的要点是什么)仅仅基于
Is open
而不是
T

void f(void&T)
是无效的……”因为
void&
替换失败. 它不是一个子替换,
T
不是函数的模板参数。
是开放的
也是非模板依赖的,对于
模板类a{static constexpr bool是开放的=!std::is_same::value;/*…*/}
,您可以对其使用概念。SFINAE要求模板类型来自函数(即使从类1默认)。