相关疑难解决方法(0)

为什么我应该避免函数签名中的std :: enable_if

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++ templates sfinae enable-if c++11

163
推荐指数
3
解决办法
4万
查看次数

没有编译器挂钩,哪个<type_traits>无法实现?

C++ 11提供了标准<type_traits>.

没有编译器挂钩,哪些是不可能实现的?

  • 注1:编译器钩子我指的是任何非标准语言特征,例如__is_builtin....
  • 注2:它们中的很多都可以在没有钩子的情况下实现(参见 C++ Template Metaprogramming的第2章和/或Modern C++ Design的第2章).
  • 注3:前一个问题中的蹩脚答案引用了N2984,其中一些类型特征包含以下注释:被认为需要编译器支持(感谢sehe).

c++ type-traits c++11

26
推荐指数
2
解决办法
1428
查看次数

使用sfinae的别名模板:语言允许吗?

我刚刚发现了以下技术.它看起来非常接近提议的概念语法之一,完全适用于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)

c++ sfinae language-lawyer c++11

26
推荐指数
2
解决办法
467
查看次数

非类型模板参数可以是“ void *”类型吗?

Yakk-Adam Nevraumont

void*在标准的至少某些版本中,不允许使用type的非类型模板参数。

这是真的?如果为真,则在哪些版本的标准中void*不允许使用非类型模板参数?

(注意:正如在 回答 另一个评论的评论中所指出的 ,这是关于非类型模板参数,而不是模板类型参数模板参数可以是每个 [temp.arg.type]的有效type-id,包括。void*

c++ templates language-lawyer c++17 c++20

11
推荐指数
1
解决办法
280
查看次数