gpt4 book ai didi

c++ - 模板类+虚函数=必须实现?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:54 25 4
gpt4 key购买 nike

这段代码:

template <typename T>
struct A
{
T t;

void DoSomething()
{
t.SomeFunction();
}
};

struct B
{
};

A<B> a;

很容易编译,没有任何提示,只要我从不调用 a.DoSomething() .

但是,如果我定义 DoSomething作为虚函数,我会得到一个编译错误,指出 B不声明 SomeFunction .我多少能明白为什么会这样(DoSomething 现在应该在 vtable 中有一个条目),但我不禁觉得它并不是真正的义务。而且它很烂。

有什么办法可以克服这个问题吗?

编辑 2: 好的。我希望这一次有意义:假设我正在进行侵入式引用计数,因此所有实体都必须从基类 Object 继承。我怎样才能支持原始类型呢?我可以定义:

template <typename T>
class Primitive : public Object
{
T value;
public:
Primitive(const T &value=T());

operator T() const;

Primitive<T> &operator =(const T &value);
Primitive<T> &operator +=(const T &value);
Primitive<T> &operator %=(const T &value);

// And so on...
};

所以我可以使用 Primitive<int> , Primitive<char> ...但是Primitive<float>怎么样? ?这似乎是个问题,因为 float 没有 %=运算符(operator)。但实际上,它不是,因为我永远不会调用 operator %=Primitive<float> .这是模板特意设计的功能之一。

如果出于某种原因,我会定义 operator %=作为虚拟。或者,如果我预先导出 Primitive<float>从 dll 中避免链接错误,即使我从不调用 operator %=,编译器也会报错在 Primitive<float> 上.如果它只是为 operator %= 填充一个虚拟值在 Primitive<float>的 vtable(引发异常?),一切都会好起来的。

最佳答案

将虚函数放入可选择的基类中...

struct Jumper
{
virtual void Jump =0;
};

struct Crawler
{
virtual void Crawl() =0;
};

struct JumperCrawler:
public Jumper,
public Crawler
{
};

template<typename T, typename Methods>
class ICanBoostJumpingAndCrawling :
public Methods
{
T t;
};

现在您可以将 ICanBoostJumpingAndCrawling 与作为方法模板参数提供的 Jumper、Crawler 或 JumperCrawler 一起使用;意识到您需要从它派生,以便您可以在子类中实现 Jumping 和/或 Crawling。

仅供引用,这使得名称“ICanBoostJumpingAndCrawling”完全具有误导性,因为它可能会也可能不会这样做;这意味着它应该重命名为类似“Booster”的名称。

关于c++ - 模板类+虚函数=必须实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1489744/

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