Вызов функции внутри пространства имен T - PullRequest
0 голосов
/ 03 мая 2018

Допустим, у меня есть перечисление в пространстве имен с некоторыми вспомогательными функциями:

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.

1 Ответ

0 голосов
/ 04 мая 2018

Насколько я знаю, вы не можете использовать пространства имен в метапрограммировании c ++ так, как вы можете использовать типы.

Если фрагмент из вопроса взят из кода, который вы можете переписать, вы можете использовать struct вместо namespace для инкапсуляции ваших enum s.

Это может выглядеть примерно так:

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

Самореклама :

Некоторое время назад я написал крошечную библиотеку enum traits , использующую макросы препроцессора boost. Он также выполняет преобразование в строку и из строки и может помочь вам в решении проблемы SFINAE.

Мое решение состояло в том, чтобы определить черту параллельно с enum class.

...