gpt4 book ai didi

C++成员函数的多重定义,基于枚举模板参数

转载 作者:行者123 更新时间:2023-11-27 22:44:45 24 4
gpt4 key购买 nike

考虑这段代码:

template<typename T, SomeEnum mode> struct TC{

T data;

//...

void doStuff();
};

根据为模板设置的枚举值,“doStuff”可以有多个定义吗?

TC<int, SomeEnum::MODE_1> tc1;    tc.doStuff(); //do some stuff
TC<int, SomeEnum::MODE_2> tc2; tc.doStuff(); //do some other stuff

(我的意思不是保存“模式”并在其上创建一个分支,而是实际上是多个定义。)

最佳答案

您可以进行标签分派(dispatch)。只需为枚举的每个打包值提供一个重载:

template<typename T, SomeEnum mode> struct TC{

T data;

//...
template<SomeEnum v>
using tag_type = std::integral_constant<SomeEnum, v>;

void reallyDoStuff(tag_type<SomeEnum::MODE_1>);
void reallyDoStuff(tag_type<SomeEnum::MODE_2>);

void doStuff() { reallyDoStuff(tag_type<mode>{}); }
};

因为类模板的成员函数除非被使用否则不会被实例化,所以你只需要实例化 reallyDoStuff 的一个定义。 (正确的)对于 TC 的每个实例.

当有疑问时,首选函数模板重载而不是特化。它通常是更好的选择。

关于C++成员函数的多重定义,基于枚举模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44484376/

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