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)