我正在开发一个C ++ ROS项目,它包含不同的类,每个类都包含一个向量。
困难在于载体可以是不同类型的。例如:
class A{
public
.....
private
std::vector<Class_C> List
}
class B{
public
.....
private
std::vector<Class_D> List
}
我怎么能完成这样的任务?我想找到一种使用模板,继承和其他语言功能来简化代码的方法。
答案 0 :(得分:3)
只需使用模板参数:
DECLARE @t TABLE (n int)
DECLARE @n int = (SELECT MAX(LEN(s) - 2) FROM @strs)
WHILE @n > 0
BEGIN
INSERT INTO @t (n) VALUES (@n)
SET @n = @n - 1
END
SELECT s.s, p.s, p.pat
FROM @strs s
LEFT JOIN
(
SELECT s, n, SUBSTRING(s, n, 3) AS pat
FROM @strs CROSS JOIN @t
WHERE n <= LEN(s) - 2
) p ON s.s <> p.s
WHERE CHARINDEX(p.pat, s.s) = p.n
这允许template <typename T>
class A{
public
.....
private
std::vector<T> List;
}
拥有任何类型的A
:
vector
答案 1 :(得分:1)
由于我的声誉无法发表评论,我必须写一个答案,但Gill Bates' answer可以解决您的问题,即使您不清楚您想要完成什么。为了扩展他的答案,你可以使用基于他的模板类的继承来简化你的编码并强制将一个类型放入你的列表中(在这种情况下你还需要将列表可见性改为protected):
class FooInt : public A<int>{
public
void print() { /* print List's content */ }
...
};
class FooString : public A<std::string>{
public
void print() { /* print List's content */ }
...
};
您以这种方式使用您的课程:
FooInt hello;
hello.print(); // Would print list of int
FooString moto;
moto.print(); // Would print list of string
请注意,类的名称只写为Foo *,以帮助您了解其基础列表将包含以名称编写的类型,这可能是您继承自A类的类B ...
答案 2 :(得分:0)
这就是你要找的东西吗?
template <typename T>
class A {
public:
.....
protected:
std::vector<T> List;
};
class B : public A<Class_D> {
public:
.....
};
B b;