根据 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> {
};
我想要一个 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> {
};