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

时间:2015-01-18 18:41:03

标签: c++11 atomic 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之间定义的<>类型?

3 个答案:

答案 0 :(得分:4)

你可以这样做:

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

答案 1 :(得分:2)

好吧,你不想返回与bar相同类型的东西......

≥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语法看起来有多简单(尽管是样板文件)。

答案 2 :(得分:1)

是的,std::atomic没有value_type成员或类似的东西,所以这不是“微不足道的”。嗯,确实如此,但事实并非如此。 MEH。

如果您遇到C ++ 11:

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

从C ++ 14开始,您可以简单地写一下:

#include <atomic>

std::atomic<int> bar;

auto foo()
{
    return bar++;
}