【问题标题】:Calling a function inside the namespace of T在 T 的命名空间内调用函数
【发布时间】:2018-05-03 10:46:06
【问题描述】:

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

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 在同一个命名空间中。

【问题讨论】:

  • 您是否可以控制FromString()s 的定义方式?如果是这样,您可以改为将它们设为void FromString(std::string, MyEnum &amp;),并使用依赖于参数的查找来调用它们。
  • 这可能与Argument Dependent Lookup相关/被@

标签: c++ sfinae


【解决方案1】:

据我所知,在 c++ 元编程中你不能像使用类型那样使用命名空间。

如果问题中的 sn-p 来自您可以重写的代码,您可以做的一件事是使用 struct 而不是 namespace 来封装您的 enums。

它可能看起来像这样:

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

自我宣传

不久前,我使用 boost 预处理器宏写了一个很小的 ​​enum traits library。它还可以与字符串进行转换,并且可以帮助您解决 SFINAE 问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2021-06-12
    • 2011-05-25
    • 1970-01-01
    • 2011-01-11
    • 2014-07-15
    • 2012-10-13
    相关资源
    最近更新 更多