Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类的向量的调用成员函数_C++_Templates_Vector - Fatal编程技术网

C++ 模板类的向量的调用成员函数

C++ 模板类的向量的调用成员函数,c++,templates,vector,C++,Templates,Vector,我有一个模板化类(顺便说一句,我使用模板化类是因为它提供了巨大的性能增益): 模板 甲级; 我的第一个问题是我想做一个向量。有些人建议使用boost::any,现在我只使用void* a0; A a1; 向量v; v、 推回(&a0); v、 向后推(&a1); 当我想调用这个向量元素的某个成员函数时,问题来了: for(自动a:v) (A*)A->foo(); 当然,这不起作用,因为我在对话期间没有提供模板参数。。。。 但是,我找不到任何好的方法来让它工作 你知道吗?A和A是完全不同的类

我有一个模板化类(顺便说一句,我使用模板化类是因为它提供了巨大的性能增益):

模板
甲级;

我的第一个问题是我想做一个向量。有些人建议使用
boost::any
,现在我只使用
void*

a0;
A a1;
向量v;
v、 推回(&a0);
v、 向后推(&a1);

当我想调用这个向量元素的某个成员函数时,问题来了:

for(自动a:v)
(A*)A->foo();

当然,这不起作用,因为我在对话期间没有提供模板参数。。。。 但是,我找不到任何好的方法来让它工作

你知道吗?

A
A
是完全不同的类

考虑:如果有两个类X和Y都有
foo
方法:

class X {public: void foo() {std::cout << "X::foo" << std::endl;}};
class Y {public: void foo() {std::cout << "Y::foo" << std::endl;}};
答案很简单:您不能像这样通过名称访问成员

(如果有人创建了一个类
Z
,它也有一个
foo
方法怎么办?如果向量中有
Z
,那么你会期望它调用它;但是在编译代码时,成员名会被删除,所以它不会知道这个成员也被称为
foo
!)

但是,您可以创建一个基类并使该方法虚拟:

class XYBase {
public:
    virtual void foo() = 0;
}
class X : public XYBase {public: void foo() {std::cout << "X::foo" << std::endl;}};
class Y : public XYBase {public: void foo() {std::cout << "Y::foo" << std::endl;}};
XYBase类{
公众:
虚拟void foo()=0;
}

类X:public XYBase{public:void foo(){std::cout请发布一些真实的代码。
A a0();
是一个函数声明。这是真实的代码。
A a0();
调用构造函数。删除你的否决票。否。这是一个函数声明。请查看最烦人的解析。
A a0;
A a0{};
调用构造函数,
A a0();
是一个函数声明。好吧,你是对的。但是,堆栈溢出是什么时候变得如此严重的?根据wikipedia的说法,这是一个非常微妙的错误。我刚刚发布了一个简化版本的实际代码,其中包含构造函数参数。@Oli:如果这是类的主要用途,你可能想再次检查性能。引入为了以多态方式访问类而使用的基类可能会消耗通过模板化该类而获得的任何性能增益。
class XYBase {
public:
    virtual void foo() = 0;
}
class X : public XYBase {public: void foo() {std::cout << "X::foo" << std::endl;}};
class Y : public XYBase {public: void foo() {std::cout << "Y::foo" << std::endl;}};
vector<XYBase*> v;
v.push_back(new X);
v.push_back(new Y);
for(auto a : v)
    a->foo(); // works!
class XBase {
public:
    virtual void foo() = 0;
}

template<int N> class X : public XBase {
public:
    void foo() {
        std::cout << "X<" << N << ">::foo" << std::endl;
    }
};

// ... later ...

vector<XBase*> v;
v.push_back(new X<1>);
v.push_back(new X<2>);
for(auto a : v)
    a->foo(); // works!