相关疑难解决方法(0)

模板别名的相等

我尝试创建无法与原始别名区分开的模板别名。

因此,我创建特征以检查2个模板(非类型)是否相等:

template <template <class...> class C1,
          template <class...> class C2>
struct is_same_template : std::false_type {};

template <template <class...> class C1>
struct is_same_template<C1, C1> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)

现在测试一下:

// Expected alias
template <typename ... Ts> using V_Ts = std::vector<Ts...>;    // Variadic
// Fallback alias
template <typename T, typename A> using V = std::vector<T, A>; // Exact count

static_assert(!is_same_template<std::vector, V_Ts>::value); // Alias rejected by gcc/clang
static_assert( is_same_template<std::vector, V>::value);    // Alias accepted only for gcc
Run Code Online (Sandbox Code Playgroud)

演示版

是否可以创建“ true”别名?哪个编译器是正确的?

c++ template-templates using-declaration language-lawyer

10
推荐指数
1
解决办法
207
查看次数

模板的别名。谁是对的?

以下代码看似合理,但不适用于两大编译器

#include <type_traits>

template<template<class> class Tmp>
struct S{
    template<class T>
    using tmp_t = Tmp<T>;

    static_assert(std::is_same_v< S<tmp_t>, S<Tmp> >,
        "Not same?? How come?");
};

template<class> struct Dummy{};

template struct S<Dummy>;
Run Code Online (Sandbox Code Playgroud)

7.1开始的gcc编译正常(https://godbolt.org/z/DjAcgP

clang ( https://godbolt.org/z/ewBbZJ )

msvc ( https://godbolt.org/z/6ZmQwj )
没有这样做

这个代码标准符合吗?

c++ language-lawyer

6
推荐指数
1
解决办法
142
查看次数