使用特定参数分类阻止或阻止Object实例化

时间:2015-11-24 18:46:25

标签: c++ templates constructor

考虑以下课程:

template<int A, int B>
class Point
{
    int x;
    int y;
public:
    Point() : x(A), y(B) { std::cout << "This is allowed" << std::endl; }
};
template<> Point<0, 0>::Point() { std::cout << "This is not allowed" << std::endl; }

我希望只允许用户在

的情况下实例化这个类
Point<A, B> pt;

其中A和B不等于零,所以具体情况为

Point<0, 0> pt;

应该被禁止。

阻止用户创建此类对象甚至阻止其使用的最佳方法是什么? (例如,呼叫成员函数等。)

例如,是否有可能使它成为Point<0, 0>,被调用的构造函数是私有的?或者也许在构造函数中从所述Point构造函数的模板特化中调用析构函数?

1 个答案:

答案 0 :(得分:1)

只需放置一个static_assert:

template<int A, int B>
class Point
{
    int x;
    int y;
public:
    Point() : x(A), y(B)
    {
        static_assert( ! (A == 0 && B == 0), "This is not allowed");
    }
};

int main()
{
    // This is not allowed:
    // Point<0, 0> p00;
    Point<0, 1> p01;
    Point<1, 0> p10;
    return 0;
}

免责声明:我没有看到模板的用例。