gpt4 book ai didi

c++ - 如何将用户定义的枚举映射到模板函数中的内置类型?

转载 作者:行者123 更新时间:2023-11-30 03:22:43 26 4
gpt4 key购买 nike

我仍在尝试将我的旧程序更新为现代 C++,并且我有另一个与模板相关的问题。我正在使用 libconfig++ 来处理程序配置,将纯文本数据写入配置文件。您可以选择要写入文件的数据类型,库使用枚举来执行此操作(即 Setting::TypeString、Setting::TypeBoolean 等)

起初,我使用普通重载,如下所示:

void Config::write_value(Setting& root, const string& key, const string& value) {
if (!root.exists(key.c_str())) root.add(key.c_str(), Setting::TypeString) = value;
else {
Setting& s = root[key.c_str()];
s = value;
}
}

void Config::write_value(Setting& root, const string& key, const bool value) {
if (!root.exists(key.c_str())) root.add(key.c_str(), Setting::TypeBoolean) = value;
else {
Setting& s = root[key.c_str()];
s = value;
}
}

但是这些函数是通用处理的候选者,因为只有一个参数发生变化,并且可以从参数中推断出库使用的类型。

问题是:我该怎么做?我尝试使用 conditional_t 和 is_same,但编译器对我的尝试不满意,出了点问题,我认为这与枚举有关 ...

What's the right way to map the enum to the parameter type ?

这是我尝试过的(众多)之一:

template<typename T>
using Type = std::conditional_t<std::is_same_v<T, bool>, Setting::TypeBoolean, void>;

template<typename T>
void write_value(libconfig::Setting& root, const std::string& key, const T& value)
{
if (!root.exists(key.c_str())) root.add(key.c_str(), Type<T>) = value;
else {
Setting& s = root[key.c_str()];
s = value;
}
}

// Compiler error :
error C2275: 'Config::Type<bool>' : illegal use of this type as an expression

感谢阅读我:)

编辑Setting::* 是一个枚举,实际上定义为 Setting::Type。

 enum Type
{
TypeNone = 0,
// scalar types
TypeInt,
TypeInt64,
TypeFloat,
TypeString,
TypeBoolean,
// aggregate types
TypeGroup,
TypeArray,
TypeList
};

最佳答案

你没有在这里解释对象 root.add() 如何能够从任意类型分配,但这似乎不是你目前要求我们解决的问题......

您当前要解决的问题是专门将模板类型转换为适当的枚举索引,为此在 c++11 中我将简单地定义一个转换器类:

template <class T> class ToMySetting {};
template <> ToMySetting<int> { static Setting index = {Setting::TypeInt}; };
template <> ToMySetting<char*> { static Setting index = {Setting::TypeCStr}; };
template <> ToMySetting<bool> { static Setting index = {Setting::TypeBool}; };

然后您可以使用您的 write_value用作ToMySetting<T>::index

在较新的版本 (c++17) 中,我倾向于使用 if constexpr只定义一次 ToMySetting 转换器类主体的语法。

关于c++ - 如何将用户定义的枚举映射到模板函数中的内置类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50932857/

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