【问题标题】:Template Class C++ - exclude some types模板类 C++ - 排除某些类型
【发布时间】:2012-04-08 08:57:59
【问题描述】:

我最近创建了一个工作正常的模板类。

现在我想使用“const int”(例如),但禁止动态绑定。

是否有可能排除类型 const int?

这是我的课;编译器将丢弃第二个构造函数的错误。我已经看到了那个,但我只是不知道如何以正确的方式修改它 - 和想法?

template <class T>
class Vector2D
{
public:
    T X;
    T Y;

    Vector2D()
    {
        X = 0;
        Y = 0;
    };

    Vector2D(T x, T y)
    {
        X = x;
        Y = y;
    };
}

【问题讨论】:

  • 您可以通过重载和/或类型特征处理像const 这样的限定符。如果您想在调用者在参数中使用 const 限定符时导致编译器错误,请在适当的位置使用 static_assert

标签: c++ templates types


【解决方案1】:

使用成员初始化列表:

template <class T>
class Vector2D
{
public:
    T X;
    T Y;

    Vector2D(): X(0), Y(0)
    {
    };

    Vector2D(T x, T y):X(x),Y(y)
    {
    };
}

这应该可以解决您当前使用const int 的问题。如果你真的有兴趣在一般情况下禁止某种类型,请查看boost::enable_if

【讨论】:

    【解决方案2】:

    您可以使用type_traitsstatic_assert 来防止使用const 类型实例化您的类。

    #include <type_traits>
    
    template <class T>
    class Vector2D
    {
      static_assert( !std::is_const<T>::value, "T must be non-const" );
        T X;
        T Y;
    
    public:
        Vector2D() : X( 0 ), Y( 0 )
        {
        }
    
        Vector2D(T x, T y) : X( x ), Y( y )
        {
        }
    };
    
    
    int main()
    {
      Vector2D<int> v1( 10, 20 );
      Vector2D<const int> v2( 10, 20 ); //static_assert fails
    }
    

    另外,我已经更改了您的类以在构造函数中使用成员初始化列表来初始化成员变量。我已经制作了xy private

    【讨论】:

      【解决方案3】:

      这就是“概念检查”的用途。

      查看http://www.boost.org/doc/libs/1_49_0/libs/concept_check/concept_check.htm

      (不过,GCC 4.7 在 std:: 中实现了它,因为它很可能会被添加到未来的标准中。)

      【讨论】:

        猜你喜欢
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-03
        相关资源
        最近更新 更多