C++ 我可以用decltype替换enable_if吗
我在想,如果,我能用它来代替启用吗?例如:C++ 我可以用decltype替换enable_if吗,c++,visual-studio,gcc,decltype,enable-if,C++,Visual Studio,Gcc,Decltype,Enable If,我在想,如果,我能用它来代替启用吗?例如: template <typename T> decltype(T(), declval<bool>()) isConstructable() { return true; } 模板 decltype(T(),declval())是可构造的(){return true;} 在Visual Studio 2015上使用isConstructable成功,在isConstructable失败:但在: 模板 如果是可构造的(){re
template <typename T>
decltype(T(), declval<bool>()) isConstructable() { return true; }
模板
decltype(T(),declval())是可构造的(){return true;}
在Visual Studio 2015上使用isConstructable
成功,在isConstructable
失败:但在:
模板
如果是可构造的(){return true;}则启用
decltype
版本是否有效,或者我只是在利用一个非标准的MicrosoftianSim?std::declval()的类型是bool&
,而不是bool
。这就是警告的来源-true
需要通过引用返回
类似的内容应该在没有警告的情况下编译:
bool ok() { return true; }
template <typename T>
decltype(T(), ok()) is_constructable() { return true; }
int main() {
cout << is_constructable<int>() << endl;
}
bool ok(){return true;}
模板
decltype(T(),ok())是可构造的(){return true;}
int main(){
cout如所述,如果您这样做:
is_rvalue_reference_v<decltype(isConstructable<int>())>
T
可能重载了,
运算符,在这种情况下,需要缓冲void()
:
template <typename T>
decltype(T(), void(), bool()) isConstructable() { return true; }
模板
decltype(T(),void(),bool())是可构造的(){return true;}
如果您使用traits forstd::enable\u,如果
您可以有正确和错误的版本。它不是(总是)有了decltype
@Jarod42,我实际上只是想在decltype
/enable_如果失败的情况下寻找一个编译错误,所以我不打算用错误的专门化来使用它,尽管我可以看出这是decltype
版本不可用的用例。@JonathanMee:如果你只是想如果不是编译错误,只需按正常方式编写模板代码。如果它导致代码无法工作,则会导致编译错误。@Nicolas我实际上对使用它很感兴趣,就像在元编程中使用实际值一样。我只是将构造用作MCVE,我实际上有一个函数正在测试可用性,我将使用这个函数有趣的是,似乎您在gcc上是正确的,但在Visual Studio上是错误的:declval
实现似乎是这里的问题。decltype(T(),void(),true)
应该足够了。(void()
添加以避免操作符的邪恶重载,
)@Jarod42说得好,如果enable\u
,这在enable\u如果void
中会发生什么?我也需要用void
进行缓冲吗?既然enable\u如果只接受两个参数,我该如何处理呢。@JonathanMee:如果t
,它将是std::enable\u如果t
(或者在你的例子中,使用traitsstd::enable\u如果t
)
template <typename T>
decltype(T(), bool()) isConstructable() { return true; }
template <typename T>
decltype(T(), void(), bool()) isConstructable() { return true; }