gpt4 book ai didi

c++类型别名在测试特化时不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:16 25 4
gpt4 key购买 nike

使用C++,尝试实现:is_specialization_of

template<typename T, template<typename...> class Template>
struct is_specialization_of : std::false_type {};

template<template<typename...> class Template, typename... Tn>
struct is_specialization_of<Template<Tn...>, Template> : std::true_type {};

template<typename... Tn>
struct tstruct {};

template<typename... Tn>
using ustruct = tstruct<Tn...>;

int main( int argc, char **argv )
{
printf( "test u<int> against u, return %s\n", is_specialization_of<ustruct<int>, ustruct>::value ? "true" : "false" );
printf( "test u<int> against t, return %s\n", is_specialization_of<ustruct<int>, tstruct>::value ? "true" : "false" );
printf( "test t<int> against u return %s\n", is_specialization_of<tstruct<int>, ustruct>::value ? "true" : "false" );
printf( "test t<int> against t, return %s\n", is_specialization_of<tstruct<int>, tstruct>::value ? "true" : "false" );
getchar();
return 0;
}

返回:

test u<int> against u, return false
test u<int> against t, return true
test t<int> against u return false
test t<int> against t, return true

看起来类型别名并没有完全被认为是原始类型

我正在使用 Visual Studio Community 2017

Microsoft (R) C/C++ Optimizing Compiler Version 19.15.26732.1 for x64

然而,当尝试使用 gcc 编译相同的代码时,它返回:

test u<int> against u, return true
test u<int> against t, return true
test t<int> against u return true
test t<int> against t, return true

有什么我可以做的解决方法吗?

最佳答案

Looks like the type alias is not considered exactly as the original type, or did I miss something?

别名特化正是它所代表的类型。但是别名 tempalte 是一个完全不同的模板。输出的原因由 [temp.alias]

指定

1 A template-declaration in which the declaration is an alias-declaration declares the identifier to be an alias template. An alias template is a name for a family of types. The name of the alias template is a template-name.

2 When a template-id refers to the specialization of an alias template, it is equivalent to the associated type obtained by substitution of its template-arguments for the template-parameters in the type-id of the alias template.

如果我们在考虑以上两段的情况下检查您的测试用例,我们会看到:

  1. “针对 u<int> 测试 u - ustruct<int>等同于指定 tstruct<int>直接地。和 tstruct<int>不是 ustruct 的特化.该特征需要评估为 false。

  2. "test u<int> 反对 t " - 这里 ustruct<int>同样等同于指定 tstruct<int>直接地。和 tstruct<int>tstruct 的特化.该特征应报告为真。

  3. “针对 t<int> 测试 u - tstruct<int>不是 ustruct 的特化,就像我们之前观察到的那样。该特征应报告错误。

  4. “针对 t<int> 测试 t - 应报告为真。

当在 MSVC 中运行时,您的所有测试都符合 C++ 标准规定的它们应该执行的操作。 GCC 在这里不符合要求,这是一个编译器错误。

关于c++类型别名在测试特化时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53466773/

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