Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Equality of template aliases

I try to create template alias which cannot be distinguished from original.

So, I create traits to check when 2 templates (not types) are equal:

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 {};

Now test it:

// 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

Demo

Is it possible to create "true" alias? which compiler is right?

like image 454
Jarod42 Avatar asked May 06 '19 18:05

Jarod42


People also ask

What is template alias?

A template alias is a reference to a version of a template. For example, suppose that you create the template alias exampleAlias for version 1 of the template exampleTemp .

What is Typename C++?

" typename " is a keyword in the C++ programming language used when writing templates. It is used for specifying that a dependent name in a template definition or declaration is a type.


1 Answers

I try to create template alias which cannot be distinguished from original.

I don't think this is currently possible. There are (unfortunately) no template aliases, there are only alias templates. And an alias template is always a template of its own [temp.alias]/1. A specialization of an alias template is equivalent to the type you get by substituting the template arguments into the alias template, but the alias template itself is not an alias for another template [temp.alias]/2. I would consider GCC letting your second static_assert pass a bug in GCC…

As pointed out by @HolyBlackCat in the comment above, there is a related question and answer which points to numerous related CWG issues. One issue in particular (CWG 1286) would seem to suggest that there is desire to allow an alias template to itself be equivalent to the template it refers to under certain circumstances. However, it does not seem that the proposed resolution has been adopted due to concerns raised later. The relevant wording in the current standard draft ([temp.alias] and [temp.type]) appears to be unchanged from C++11…

like image 67
Michael Kenzel Avatar answered Oct 02 '22 14:10

Michael Kenzel