问题 1:我有以下代码:
template<typename T, typename S>
class Base {
virtual void fun(const T& arg1, const S& arg2) = 0;
private:
T v1;
S v2;
};
class Derived1 : public Base<int, double> {
public:
virtual void fun(int &arg1, double &arg2) override {
// do some special stuff
}
};
class Derived2 : public Base<float, int> {
public:
virtual void fun(float &arg1, int &arg2) override {
// do some special stuff
}
};
我需要在单个 vector 中收集对这些对象(Derived1 和 Derived2)的所有引用以循环遍历它们并在每个对象上调用 fun。
问题 2:同样的问题,但是 base 现在有可变模板参数
template<typename T, typename ... S>
class Base {
virtual void fun(const T& arg1) = 0;
private:
T v1;
std::tuple<std::vector<S>...> v2;
};
class Derived1 : public Base<int, double, int, int> {
public:
virtual void fun(int &arg1) override {
// do some special stuff
}
};
class Derived2 : public Base<float, int, double, double> {
public:
virtual void fun(float &arg1) override {
// do some special stuff
}
};
有没有一种方便的方法可以将对 Derived1 和 Derived2 对象的所有引用收集到一个 vector 中?
最佳答案
所以您对什么是模板存在根本性的误解。 Variadic 与您的问题无关。
采用以下模板:
template <typename T>
class Foo
{
T member_;
public:
Foo(){}
T& member() {return member_;}
virtual bar() {printf("bar");}
};
int main(int argc,char* argv)
{
Foo<int> a;
Foo<string> b;
}
a
的类型之间有什么关系?和 b
?答案是没有。当然,它们来自相同的代码库,但它们是完全不同的类型,具有不同的大小、接口(interface)等。对于模板特化,您无法保证它们的相似程度。
您正在尝试做的是模板化多态类的派生。所以就这样做,即:
class Bar
{
public:
virtual bar() = 0;
};
template <typename T>
class Foo : public Bar
{
T member_;
public:
Foo(){}
T& member() {return member_;}
virtual bar() {printf("bar");}
};
然后就可以收集所有的东西,访问Bar的界面了。
就像所有的继承一样,你可以继续提供子类:
class Derived1 : public Foo<int> { virtual bar() {printf("derived1");}};
class Derived2 : public Foo<string> { virtual bar() {printf("derived2");}};
Derived1
是 Foo<int>
是 Bar
, Derived1
是 Foo<string>
是 Bar
.
关于C++ 多态性和可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26368691/