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

标签 c++ templates enums

我仍在尝试将我的旧程序更新为现代 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/

相关文章:

c++ - 为什么 std::sub_match<T> 公开继承自 std::pair<T, T>?

c++ - 从格式为 %.1f 的 printf 中查找舍入数字的意外错误?

forms - 使用 Symfony2 在 Twig 模板中渲染表单

C++:从 union 中检索值的模板函数

c# - 在 LINQ 查询期间读取文件

enums - Haxe 中的构造函数和枚举

c++ - 在 C++ 中定义类作用域常量的最佳方法

父返回子中的 C++ 函数

c++ - 错误 C2039: 'Open':不是“std::basic_fstream”的成员

java - 在 Java 中实现通用接口(interface)的枚举常量