根据 class 模板参数值禁用成员函数

Disable a member function based on class template parameter value

我想要一个 class,其中 disables/enables 成员函数基于 class 的模板参数值。我有以下内容:

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 来决定 return 类型或函数参数之一

如果我没理解错的话,您需要以下其中一项:

enable_if 在您不想 enable/disable 的 return 类型的函数中 (你仍然可以使用函数 return bool):

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

或静态断言声明:

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

第三个选项是将要禁用的功能移到基地class。然后为 type1 专门化该基数并将其留空:

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

template<>
struct SpecialStuff<type1> {
};

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