我试图编写一个模板类,根据接口的模板实现定义模板。为了澄清我的问题,这里有一个例子。
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的模板。
答案 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, "!");
}
这种方法的好处在于您不必同时修改A
和B
。