用于实现模板接口的类的模板

时间:2016-12-22 22:36:03

标签: c++ templates

我试图编写一个模板类,根据接口的模板实现定义模板。为了澄清我的问题,这里有一个例子。

template<typename T>
class A{
    virtual T getValue() = 0;
}

class B : public A<int>{
    //does some things and implements getValue
}

//template definition
//T should become int by passing class B
class C{
    A* aPointer;
    T previousValue;
} 

我已经尝试过模板模板(不是输入错误)语法,在这篇文章中解释得非常好。 What are some uses of template template parameters in C++?。但是因为A的类型在B的定义中是无止境的,所以它不起作用。

我应该怎么做并创建一个确定T的模板。

3 个答案:

答案 0 :(得分:2)

您无法直接从B确定T的类型,但您可以从其界面中确定。处理此问题的最佳方法是将A的typedef添加到A。

template<typename T>
class A{
    virtual T getValue() = 0;
public:
    typedef T ValueType;
}

class B : public A<int>{
    //does some things and implements getValue
}

template<class T>
class C {
    A<typename T::ValueType>* aPointer;
    typename T::ValueType previousValue;
} 

答案 1 :(得分:0)

在类接口中定义命名类型别名。

标准库也可以这样做。

template<typename T>
class A{
  public:
    using value_type = T;
    virtual value_type getValue() = 0;
};

class B : public A<int>{
public:
  using A<int>::value_type;
    //does some things and implements getValue
  value_type getValue() override { return 0; }
};

//template definition
//T should become int by passing class B
template<class Derived>
class C{
public:
  using value_type = typename Derived::value_type;
    A<value_type>* aPointer;
    value_type previousValue;
};

int main()
{
  C<B> c;

  auto x = c.aPointer->getValue();

}

答案 2 :(得分:0)

您可以使用支持功能,甚至不必给出定义 它遵循一个最小的工作示例:

#include<type_traits>
#include<utility>

template<typename T>
class A{};

class B : public A<int>{};

template<typename T>
T a_type(const A<T> &);

template<typename T>
class C {
public:
    using type = decltype(a_type(std::declval<T>()));
};

int main() {
    static_assert(std::is_same<C<B>::type, int>::value, "!");
}

这种方法的好处在于您不必同时修改AB