启发C++ 11 decltype的使用

Nor*_*löw 13 c++ templates decltype c++11

我刚刚看到这个非常好的演讲 Rock Hard:C++由Boris Jabes 演变.在关于高阶通用编程的讨论部分中,他说以下是一个函数的例子,它的返回类型更通用,并导致更少的模板函数重载

template <typename Func>
auto deduce(const Func & f) -> decltype(f())
{..}
Run Code Online (Sandbox Code Playgroud)

然而,这可以使用如下的普通模板语法来实现

template <typename Func>
Func deduce(const Func & f)
{..}
Run Code Online (Sandbox Code Playgroud)

所以我猜选择的例子并没有真正显示出独特的力量decltype.任何人都可以举一个这样一个更具启发性的用法的例子decltype吗?

Joh*_*itb 26

你的怀疑是不正确的.

void f() { }
Run Code Online (Sandbox Code Playgroud)

现在deduce(&f)有了类型void,但是你的重写,它有类型void(*)().在任何情况下,无论你想要获得表达式或声明的类型,都要使用decltype(注意这两者之间的细微差别.decltype(x)不一定相同decltype((x))).

例如,您的标准库实现可能包含类似的行

using size_t = decltype(sizeof(0));
using ptrdiff_t = decltype((int*)0 - (int*)0);
using nullptr_t = decltype(nullptr);
Run Code Online (Sandbox Code Playgroud)

add在过去的C++中,找出正确的返回类型一直是一个具有挑战性的问题.现在这是一个简单的练习.

template<typename A, typename B> 
auto add(A const& a, B const& b) -> decltype(a + b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

鲜为人知的是,您可以在伪析构函数名称decltype之前使用::

// has no effect
(0).~decltype(0)();

// it and ite will be iterators into an initializer list 
auto x = { 1, 2, 3 };
decltype(x)::iterator it = x.begin(), ite = x.end();
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下吗:`(0).~decltype(0)();`?恐怕我不明白。 (2认同)