在T

时间:2018-05-03 10:46:06

标签: c++ sfinae

假设我在命名空间中有一个包含一些辅助函数的枚举:

namespace MyEnumNamespace
{
    enum MyEnum
    {
        Foo,
        Bar
    };

    MyEnum FromString(std::string);
}

我有一个反序列化函数,我想专门针对使用SFINAE的所有枚举(假设它们都定义了FromString函数)。

template <typename T>
std::enable_if_t<std::is_enum_v<T>, T> Deserialize(const MyVariant& variant)
{
    return FromString(variant.AsString());
}

如果不知道命名空间的名称,我如何调用FromString?我所知道的是TFromString在同一名称空间中。

1 个答案:

答案 0 :(得分:0)

据我所知,你不能在c ++元编程中使用名称空间来使用类型。

如果问题中的代码段来自您可以重写的代码,那么您可以做的一件事就是使用struct代替namespace来封装enum

看起来像这样:

struct MyEnum {
  enum { Foo, Bar } value;
  static MyEnum FromString(std::string);
}

自我推销

前段时间我使用boost预处理器宏编写了一个小enum traits library。它还可以转换为字符串,也可以帮助您解决SFINAE问题。

我的解决方案是与enum class并行定义特征。