模板匹配两个(看似)不相关的类型

hgi*_*sel 0 c++ enums templates sfinae

我有一个范围枚举:

enum class E
{ A, B, C };
Run Code Online (Sandbox Code Playgroud)

现在我想要一个函数,它接受一个scoped int或者它int自己的值.

它应该是这样的:

template <typename T, std::enable_if_t<std::is_same<T, enum E **OR** int>::value, int> = 0 >
void foo(T value);
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在C++模板中处理OR的概念.我知道std::is_convertible,但是我甚至不知道,如果我能在这里使用它,因为你只能static_cast作用域enums到诠释.

但无论如何,我不想接受任何可转换的类型,int只接受单个枚举或int的类型.

Jar*_*d42 7

重载似乎是最简单的:

void foo(int value);
void foo(E value) { foo(static_cast<int>(value); } // Or specific code
template <typename T> void foo(T) = delete; // To forbid type convertible to int
Run Code Online (Sandbox Code Playgroud)

否则你可以使用SFINAE

template <typename T>
std::enable_if_t<std::is_same<int, T>::value || std::is_same<E, T>::value>
foo(T value);
Run Code Online (Sandbox Code Playgroud)