gpt4 book ai didi

c++ - 为什么没有选择模板特化?

转载 作者:IT老高 更新时间:2023-10-28 21:43:05 24 4
gpt4 key购买 nike

我写了以下代码:

#include <iostream>
#include <string>
#include <type_traits>

template<typename, typename = void>
struct is_incrementable : std::false_type {};

template<typename T>
struct is_incrementable<T, decltype( ++std::declval<T&>() )> : std::true_type {};

int main()
{
std::cout << is_incrementable<std::string>::value << std::endl;
std::cout << is_incrementable<int>::value << std::endl;
}

当我运行它时,我得到 0 0。但我期望 0 1.

有什么想法吗?

最佳答案

对于 std::string ,选择主要模板并考虑特化。但是decltype(++std::declval<T&>())格式不正确,因此不考虑它并使用主模板(非专业模板),这导致 0 .

如果您使用 int ,它变得有点复杂。编译器一如既往地选择主模板,然后考虑特化(这是因为特化总是被认为是更好的匹配)。专业是 <int, int&>对于 int , 但与非专业模板 <int, void> 不匹配(void 是默认模板参数),因此特化被忽略,因为它不匹配。

因此,默认模板参数的类型必须匹配,否则不考虑特化,因为仅当每个模板参数都匹配特化时才采用特化。

只需附加一个 void()最后使第二个模板参数的特化匹配,因为左边的表达式被丢弃并且void()的类型是 void ,它匹配主模板的第二个模板参数。

template<typename T>
struct is_incrementable<T, decltype( ++std::declval<T&>(), void() )> : std::true_type {};

在 C++17 中,您将使用 std::void_t 为此。

关于c++ - 为什么没有选择模板特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44858395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com