默认模板参数和部分专业化

问题描述 投票:0回答:1

我正在尝试了解具有默认参数的部分模板专业化。如果我将is_comparable专长中的强制类型转换为void,则打印的值始终为false,而如果我将强制类型转换为(void),则一切正常。有人可以解释为什么需要强制转换为无效吗?这可能与匹配T3的默认模板参数有关,但是我试图在这里进一步了解模板部分特殊化和默认模板参数的注意事项。

template<typename T1, typename T2, typename T3 = void>
struct is_comparable
{
 static const bool value = false;
};

template<typename T1, typename T2>
struct is_comparable<T1, T2, decltype((void)(std::declval<T1>() == std::declval<T2>()))>
{
  static const bool value = true;
};

int main()
{
   cout << boolalpha;
   cout << is_comparable<int, char>::value << endl;
   cout << is_comparable<int, float *>::value << endl;
}

更新:即使使用指针,我也观察到相同的行为。我认为在这种情况下会选择部分专业化?

template<typename T1, typename T2, typename T3 = void>
struct is_comparable
{
 static const bool value = false;
};

template<typename T1, typename T2>
struct is_comparable<T1*, T2*, decltype((std::declval<T1>() == std::declval<T2>()))>
{
  static const bool value = true;
};

int main()
{
   cout << boolalpha;
   cout << is_comparable<int*, int*>::value << endl;
}
c++ templates decltype enable-if
1个回答
0
投票

编译器实例化主要模板并获得以下内容:

is_comparable<int, char, void>

然后,为了选择最佳匹配,它将尝试实例化您的专业化(假设没有类型转换void并假设类型替换成功,并获得以下类型:

is_comparable<int, char, bool>

它根本不与[[match主模板匹配,因此不可能是更好的匹配。

© www.soinside.com 2019 - 2024. All rights reserved.