gpt4 book ai didi

c++ - 我可以强制初始化枚举类类/函数模板的所有可能枚举值吗?

转载 作者:太空狗 更新时间:2023-10-29 23:01:07 26 4
gpt4 key购买 nike

我有一个模板类,使用枚举类作为模板参数,在头文件中定义:

// MyClass.h
enum class MyEnum {FOO, BAR};

template<MyEnum T>class MyClass {
void doStuff();
// ...
};

我想将成员函数的实际实现放在一个单独的源文件中。我知道,在那种情况下,我必须为每种情况强制执行模板的初始化:

//MyClass.cpp
template<MyEnum T>void MyClass<T>::doStuff() {
// ...
}
// Implementations of other functions

template class MyClass<MyEnum::FOO>;
template class MyClass<MyEnum::BAR>;

通常,我知道无论如何我都需要具有enum 所有 可能值的类,所以我想告诉编译器它应该实际构建模板为每个可能的值分类但没有明确提及每种可能性

换句话说:我想用一些自动化代码替换示例中的最后两行。

这有可能吗?

我也想用模板函数而不是模板类来做同样的事情。

最佳答案

让编译器知道所有可能的特化的正常方法是在同一个文件中实现它们。我想不出一个明智的方法让编译器知道模板类专用于域中的每个值。

如果你有无数个,你可以考虑使用 X macro pattern .像这样将所有案例隔离在一个头文件中(例如 MyEnum.h):

#ifndef HANDLE_ENUM_CASE(e)
#define HANDLE_ENUM_CASE(e)
#endif

HANDLE_ENUM_CASE(FOO)
HANDLE_ENUM_CASE(BAR)
// add more HANDLE_ENUM_CASE(...) expressions for every other case you have

#undef HANDLE_ENUM_CASE

在您的源文件中,您可以:

enum class MyEnum {
#define HANDLE_ENUM_CASE(e) e,
#include "MyEnum.h"
}

// (class declaration here)

#define HANDLE_ENUM_CASE(e) template class MyClass<MyEnum::e>;
#include "MyEnum.h"

关于c++ - 我可以强制初始化枚举类类/函数模板的所有可能枚举值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31788584/

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