C ++ 11可选模板类型参数?

时间:2012-12-24 02:55:10

标签: c++ templates c++11

如果我想编写一个具有可选类型参数的类,我可以执行以下操作:

template<typename T>
struct X
{
        T t;
};

template<>
struct X<void>
{

};

int main()
{
        X<int> a;
        X<void> b;
};

有没有办法写它以便不需要空白?即:

int main()
{
        X<int> a;
        X b;
};

我试过了:

template<typename T = void>
struct X
{
    T t;
};

template<>
struct X<void>
{

};

int main()
{
    X<int> a;
    X b;
};

但我明白了:

test.cpp: In function ‘int main()’:
test.cpp:16:4: error: missing template arguments before ‘b’
test.cpp:16:4: error: expected ‘;’ before ‘b’

2 个答案:

答案 0 :(得分:4)

你在技术上需要写:

X<> b;

但你可以用typedef简单地修复这个丑陋:

typedef X<> Y;

然后你可以这样做:

Y b;

答案 1 :(得分:1)

如果只有这个可能:

template <typename T>
using X = std::is_void<T>::value ? _X<> : _X<T>

但这不编译,所以不幸的是你像其他答案一样被typedef所困扰。