获取 decltype 中使用的模板的基础类型

Get underlying type for a template used in decltype

#include <atomic>

std::atomic<int> bar;

auto foo() -> decltype(bar)
{
        return bar++;
}

我收到此 gcc 错误消息:

error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&)’

decltype() 中的类型更改为 int 有效。为了使我的代码更通用,我怎样才能获得在 <>?

之间定义的类型 int

是的,std::atomic 没有 value_type 成员或类似成员,所以这不是 "trivial"。嗯,是的,但有点不是。嗯

如果您受困于 C++11:

auto foo() -> decltype(bar.load())
{
    return bar++;
}

不过,从 C++14 开始,您可以简单地写:

#include <atomic>

std::atomic<int> bar;

auto foo()
{
    return bar++;
}

你可以这样做:

auto foo() -> decltype(bar.operator++())
{
    return bar++;
}

好吧,你不想 return 与酒吧相同类型的东西......

≥ C++98

template<typename T>
T foo() {
    return bar++;
}

≥ C++11

auto foo() -> decltype(bar++) {
    return bar++;
}

≥ C++14

auto foo() {
    return bar++;
}

请注意,当我们来自 C++14(尽管是样板文件)时,C++11 语法看起来是多么简单。