首页 > 解决方案 > 模板类特化 enable_if 和默认值

问题描述

鉴于以下

template <typename T, typename Enable=void>
struct test{};

template <typename T,
    typename std::enable_if< some_trait<T>::value >::type >
struct test{};

假设some_trait<T>::valueis trueenable_if<T>::typeis void,并且选择了专业化。但是,当出现以下情况时,我的查询与选择有关。

template <typename T,
    typename std::enable_if_t< some_trait<T>::value,T>::type >
struct test{};

当为enable_if提供第二个非 void 模板参数::type时,将选择非特化模板,即使some_trait<T>::valueis true、 as ::typeisT而不是void,因此与主模板中的默认值不匹配。

我的问题是在标准中描述了选择哪个模板的顺序,以及为什么实例化test<T,void>被认为是更好的匹配test<T,T>

https://ideone.com/7v4TTS

完整样本:

#include <iostream>
#include <type_traits>

template <typename T,typename Enable=void>
struct test
{
    const char* value = "Primary";
};

#if 1// toggle this

template <typename T>
struct test<T,typename std::enable_if< std::is_same<T,T>::value >::type > 
{
    const char* value = "Specialization";
};

#else

template <typename T>                                    
struct test<T,typename std::enable_if< std::is_same<T,T>::value,T >::type> 
{                                                          ///  ^    
    const char* value = "Specialization";
};

#endif

int main() {
    test<int> v;
    std::cout << v.value << std::endl;
    return 0;
}

标签: c++c++11

解决方案


在第一种情况下,您有类型

std::enable_if< true, void >

在第二种情况下,您有类型

std::enable_if< true, int >

std::enable_if< true, int >::typeint。它不符合 a 作为类型的要求typename Enable,它被要求为void


推荐阅读