假设我在命名空间中有一个包含一些辅助函数的枚举:
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
?我所知道的是T
与FromString
在同一名称空间中。
答案 0 :(得分:0)
据我所知,你不能在c ++元编程中使用名称空间来使用类型。
如果问题中的代码段来自您可以重写的代码,那么您可以做的一件事就是使用struct
代替namespace
来封装enum
。
看起来像这样:
struct MyEnum {
enum { Foo, Bar } value;
static MyEnum FromString(std::string);
}
自我推销:
前段时间我使用boost预处理器宏编写了一个小enum traits library。它还可以转换为字符串,也可以帮助您解决SFINAE问题。
我的解决方案是与enum class
并行定义特征。