gpt4 book ai didi

c++部分模板特化,typename为void

转载 作者:行者123 更新时间:2023-12-04 13:07:21 25 4
gpt4 key购买 nike

我正在写一些关于 Partial template specialization 的内容.我想做的是使用模板is_valid检查该类是否具有名为 valid 的成员类型.源代码如下。

#include <iostream>

class A {
public:
typedef void valid;
};

class B {
public:
typedef int valid;
};

class C {
};

template <typename T, typename U = void> struct is_valid
{
const static bool value = false;
};

template <typename T> struct is_valid<T, typename T::valid>
{
const static bool value = true;
};

int main()
{
std::cout << is_valid<A>::value << std::endl;
std::cout << is_valid<B>::value << std::endl;
std::cout << is_valid<C>::value << std::endl;

return 0;
}
然而,输出是
1
0
0
最后 0很清楚,因为 C类(class)没有成员。但为什么在 B情况下,输出为0?
谁能帮我理解 Partial template specialization的机制是什么?这里?

最佳答案

对于 is_valid<B> ,找到主模板,由于没有指定第二个模板参数,默认值 void使用,实例化应该是 is_valid<B, void> .然后特化得到检查。问题是B::valid类型为 int ,从特化获得的实例化将是 is_valid<B, int> , 与主模板的实例化不匹配;因此不会选择部分特化,而是选择主模板。
对于 is_valid<A> ,同上,从主模板得到的实例是is_valid<A, void> .自 A::valid类型为 void ,部分特化给出的实例化为 is_valid<A, void>也。专业是首选和选择。
如果您将第二个模板参数指定为 int喜欢 is_valid<B, int> ,将选择部分特化。
如果只是想查看成员(member)类型是否为valid是否存在,您可以使用 std::void_t总是产生类型 void在部分专业。

template <typename T> struct is_valid<T, std::void_t<typename T::valid>> 
{
const static bool value = true;
};
LIVE

关于c++部分模板特化,typename为void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68774821/

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