从类别上防止或阻止使用特定参数实例化对象



考虑以下类:

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构造函数的模板专业化中,从构造函数内部调用析构函数?

只需放置一个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;
}

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

最新更新