如何创建特殊单词

时间:2016-06-12 09:44:20

标签: c++

我正在尝试构建一个模板类A,并通过一个特殊的单词“NONE”调用它的默认构造函数。 考虑一下:

template<class T>
class A {
public:
    A():_val(0);
    A(T val):_val(val);
private:
    int _val;
}

我希望能够写

A<int> x = None;

将调用A();

我在想也许我可以使用某种typedef,但我不知道如何

2 个答案:

答案 0 :(得分:3)

您可以提供一个虚拟类型和一个构造函数,它采用该类型,并且相当于默认构造一个实例。例如,

struct None_t {};

constexpr None_t None{}; // const None_t None = {}; in C++03

template<class T>
class A {
public:
    A() : _val() {};
    A(None_t) : A() {} // A(None_t) : _val() {} in C++03
    A(T val) : _val(val) {}
private:
    T _val;
};

int main()
{
   A<int> x = None;
}

注意我已将_val更改为intT,因为否则模板没有多大意义。

答案 1 :(得分:2)

通常的方法是创建一个标记类,在本例中为none_type并且有一个constexpr(或静态const)模型可用。

struct none_type {};
constexpr auto none = none_type {};

template<class T>
class A {
public:

    A():_val(0) {};

    A(none_type) : A() {};

    A(int val):_val(val) {};
private:
    int _val;
};

int main()
{
    A<int> a = none;
}