Pat*_*ght 3 c++ templates template-specialization c++17
我试图弄清楚如何根据模板的结果来特殊模板类。例如,假设我有以下基本模板类:
enum class BasicType
{
UNKNOWN,
PRIMITIVE,
OBJECT
};
template <typename T>
struct traits
{
static constexpr BasicType type = BasicType::UNKNOWN;
};
Run Code Online (Sandbox Code Playgroud)
我希望能够创建特征的专门化,例如,对于 std::is_integral_v 为 true 的任何类型。然后是另一个专业,其中另一个特征是正确的。
我尝试过这样的事情
template <typename T>
struct traits<std::enable_if_t<std::is_integral_v<T>, T>>
{
static constexpr BasicType type = BasicType::PRIMITIVE;
};
Run Code Online (Sandbox Code Playgroud)
但这行不通。
你已经很接近了,但是像这样使用enable_if的问题是它会阻止类型推导。基本上,编译器无法匹配您的模板专业化。不过,您可以做的是将enable_if部分移动到您旁边的第二个模板参数,T以便可以推断出:
template <typename T, typename = void>
struct traits
{
static constexpr BasicType type = BasicType::UNKNOWN;
};
template <typename T>
struct traits<T, std::enable_if_t<std::is_integral_v<T>>>
{
static constexpr BasicType type = BasicType::PRIMITIVE;
};
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为T不再隐藏在另一个模板后面。编译器仍然无法T从推导std::enable_if_t<std::is_integral_v<T>>,但是因为您T在这里还指定了 direclty: struct traits<T, ...>,所以编译器可以T通过这种方式推导,这足以匹配您的专业化。
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |