gpt4 book ai didi

c++ - 从基类指针集合中调用非虚拟成员函数?

转载 作者:行者123 更新时间:2023-11-28 02:46:26 25 4
gpt4 key购买 nike

我有一个类(class) D ,我想上课 A,B,C继承自。但是,我想声明为 pure virtual 的函数是模板化的。

不幸的是,用visual studio的话来说:

member function templates cannot be virtual

类(class) A,B,C有一个以完全相同的方式调用的成员运算符,尽管可能会返回不同的值(即 doubleunsigned int。但我很乐意让它与 double 一起工作):

template<typename T>
double operator()(T&, unsigned int b){/*code*/};

我怎样才能正确地创建类的多态集合 A,B,C (类似于 std::vector<D*>,如果我不想要成员函数模板,它会起作用)做我想做的事?

编辑:

我希望能够做的事情的一个例子:

std::default_random_engine rng((unsigned int) std::time(0));
std::vector<D*> v;
v.push_back(new A(0.3));
v.push_back(new B(1.0,3.2));
v.push_back(new C);

for(auto x : v){
for(auto y : x->operator()(rng,5){
std::cout << y << ',';
}
std::cout << std::endl;
}

最佳答案

我不完全确定你想做什么,但如果你将模板定义移动到类而不是方法,一切都会很愉快。这是否符合您的要求?

template<typename T>
class A
{
public :
virtual double operator() (T& t, unsigned int b) = 0;
};

template<typename T>
class B : public A<T>
{
public:
virtual double operator() (T& t, unsigned int b)
{
// code
}
};

编辑:

或者,假设您不希望类级别的模板,将随机计算从多态方法中移出,然后为实际困难的部分提供一个简单的多态方法怎么样。这假设你只想生成一个随机数,如果你想要更多,你总是可以创建一个随机数 vector ,其大小在构造中确定。无论如何,下面的代码演示了我在说什么:

class D
{
public :
template<typename T>
double operator() (T& t, unsigned int b)
{
double calc_rand = t();
return DoStuff(calc_rand, b);
}

protected :
virtual double DoStuff(double rnd_value, unsigned int b) = 0;
};

class A : public D
{
protected :

virtual double DoStuff(double rnd_value, unsigned int b)
{
return rnd_value * b;
}
};

int main(void)
{
std::random_device rd;
A a;
std::cout << a(rd, 5) << std::endl;
}

关于c++ - 从基类指针集合中调用非虚拟成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24253878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com