Scott Meyers发表了他的下一本书EC++ 11的内容和状态.他写道,书中的一个项目可能是"避免std::enable_if功能签名".
std::enable_if 可以用作函数参数,返回类型或类模板或函数模板参数,以有条件地从重载解析中删除函数或类.
在这个问题中,显示了所有三个解决方案
作为功能参数:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
Run Code Online (Sandbox Code Playgroud)
作为模板参数:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, …Run Code Online (Sandbox Code Playgroud) C++ 11提供了标准<type_traits>.
没有编译器挂钩,哪些是不可能实现的?
__is_builtin....我刚刚发现了以下技术.它看起来非常接近提议的概念语法之一,完全适用于Clang,GCC和MSVC.
template <typename T, typename = typename std::enable_if<std::is_rvalue_reference<T&&>::value>::type>
using require_rvalue = T&&;
template <typename T>
void foo(require_rvalue<T> val);
Run Code Online (Sandbox Code Playgroud)
我试图通过搜索请求找到它,比如"类型别名中的sfinae"并没有得到任何结果.这种技术有没有名称,语言实际上允许它吗?
完整的例子:
#include <type_traits>
template <typename T, typename = typename std::enable_if<std::is_rvalue_reference<T&&>::value>::type>
using require_rvalue = T&&;
template <typename T>
void foo(require_rvalue<T>)
{
}
int main()
{
int i = 0;
const int ic = 0;
foo(i); // fail to compile, as desired
foo(ic); // fail to compile, as desired
foo(std::move(i)); // ok
foo(123); // ok
}
Run Code Online (Sandbox Code Playgroud)
void*在标准的至少某些版本中,不允许使用type的非类型模板参数。
这是真的?如果为真,则在哪些版本的标准中void*不允许使用非类型模板参数?
(注意:正如在
回答
另一个评论的评论中所指出的
,这是关于非类型模板参数,而不是模板类型参数,模板参数可以是每个
[temp.arg.type]的有效type-id,包括。void*