使用 Base Class 的类型特征

Using Type Traits from Base Class

我正在尝试理解类型特征的概念。

说我有一些像这样的模板化 Class 层次结构和一个客户端函数:

template<typename T>
class Base
{
public:
//...
    virtual bool inline isSymmetric() const = 0;
};    

template<typename T>
class ChildrenOperation : public Base<T>
{
public:
//...
    virtual bool inline isSymmetric() const override
    {
        return true;
    }
};

template<typename T>
void clientFunction(const Base<T>& operation)
{
  //...
  if(operation.isSymmetric())
  {
      // use operation in one way 
  } else {
      // use operation in another way
  }
}

显然,clientFunction 是多态的,不同的 children 可以有不同的 isSymmetric 实现。 但是,由于 isSymmetric 似乎是常量并且实际上更多的是类型信息,我已经阅读了有关类型特征的信息并且我想知道是否可以重写客户端函数以在运行时不依赖 isSymmetric 而是编译时。

我试过添加这样的特征。但我不确定如何专门化它并在多态上下文中使用它。

template <typename T>
struct is_symmetric {
  static const bool value = false;
};

如果对称取决于从 Base 派生的具体类型,那么您不能在这种情况下使用类型特征。类型特征是在编译时评估的,所以如果你有一个多态类型,它的特征在编译时是未知的,那么你不能使用类型特征。

如果对称性确实恒定,一个可能的解决方案是:

class Base {
public:
    Base(bool symmetric) : symmetric(symmetric) {}

    bool isSymmetric() {
        return symmetric;
    }

    // ...

private:
    bool symmetric;
};

class ChildrenOperation : public Base {
public:
    ChildrenOperation() : Base(true) {}

    // ...
};

我没有在此处使用模板,因为它们与本例无关。当然,如果对称性取决于 T 那么你可以使用类型特征,像这样:

template <typename T>
struct is_symmetric : public std::false_type {};

template <>
struct is_symmetric<SymmetricT> : public std::true_type {};

所以解决方案取决于trait是否只依赖于对象的动态类型,在这种情况下你应该使用第一个代码,模板参数,在这种情况下你应该使用第二个代码,或者两者兼而有之。从您的示例来看,您的情况并不完全清楚。