gpt4 book ai didi

c++ - 在专用和非专用模板化结构之间共享代码

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:32 26 4
gpt4 key购买 nike

如何在 C++ 类的专用和非专用版本之间共享代码?

这是我要完成的人为示例:

#include <iostream>
using namespace std;

template <size_t n> struct Y {
int one() { return 1; }
int two();
};

template <> struct Y<1> {
int one() { return 11; }
int two();
};

template <size_t n> int Y<n>::two() { return one() * 2; }

int main() {
Y<1> X;
cout << X.one();
cout << X.two();
return 0;
}

这在链接时失败:

Undefined symbols for architecture x86_64:
"Y<1ul>::two()", referenced from:
_main in test-7c4ebe.o

但是,如果我更改 Y<1> X;Y<2> X; ,编译成功就好了。

我的目标是使用 two() 的示例实现对于类的特化和非特化版本。

我能够像这样通过继承解决这个问题:

#include <iostream>
using namespace std;

struct mixin {
virtual int one() = 0;
int two() { return one() * 2; }
};

template <size_t n> struct Y : public mixin {
int one() { return 1; }
};

template <> struct Y<1> : public mixin {
int one() { return 11; }
};

int main() {
Y<1> X;
cout << X.one();
cout << X.two();
return 0;
}

但我认为每次调用 Y<n>.two() 都会导致不必要的 v 表查找,对吧?

有没有办法在不滥用继承和引发 v-table 查找调用的情况下在专用版本和非专用版本之间共享代码?

最佳答案

您根本不需要将one 方法添加到mixin 中。只需将 mixin 与非虚拟 two 方法共享,以与派生类 Y 共享其实现并使用 CRTP。

#include <iostream>
using namespace std;

template <class Derive>
struct mixin {
int two() { return ((Derive *)this)->one() * 2; }
};

template <size_t n> struct Y : public mixin <Y<n>> {
int one() { return 1; }
};

template <> struct Y<1> : public mixin <Y<1>> {
int one() { return 11; }
};

int main() {
Y<1> X;
cout << X.one();
cout << X.two();
return 0;
}

关于c++ - 在专用和非专用模板化结构之间共享代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36629722/

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