Отключить функцию-член на основе значения параметра шаблона класса - PullRequest
1 голос
/ 28 апреля 2020

Я хотел бы иметь класс, который отключает / включает функции-члены на основе значения параметра шаблона для класса. У меня есть следующее:

enum MyType{ type1, type2 };
template <MyType type>
class Test{
    public:
        enum TestTraits{ testType = type };
        template <typename T>
        constexpr bool func(SomethingElse<T> else)
        {
           if(testType == type1) return false;
           // some logic that would return true or false
        }
};

Я бы хотел сделать проверку во время компиляции вместо проверки во время выполнения, и чтобы клиент даже не мог вызвать ее, если это возможно. Я уверен, что решение - enable_if, но когда я вижу это, мне кажется, что для разрешения типа возвращаемого значения или одного из параметров функции требуется enable_if

1 Ответ

2 голосов
/ 28 апреля 2020

Если я вас правильно понимаю, вам понадобится одно из следующих:

enable_if в типе возвращаемого значения функции, которую вы не хотите включать / отключать (у вас все еще может быть функция return bool):

    template <typename T>
    constexpr typename std::enable_if<type != type1, bool>::type 
    func(SomethingElse<T>)
    {
          return true;
    }

или заявление о подтверждении состояния c:

    template <typename T>
    constexpr bool func(SomethingElse<T>)
    {
         static_assert(type != type1, "can't call this with type1...");
         return true;
    }

Третий вариант - перемещение функции, которая должна быть отключена в базовом классе. Затем специализируйте эту базу для type1 и оставьте ее пустой:

template<MyType mytype>
struct SpecialStuff {
    bool func();
};

template<>
struct SpecialStuff<type1> {
};

template<MyType mytype>
struct CommonStuff : private SpecialStuff<mytype> {
};
...