What this template syntax “typename = T” mean?

倾然丶 夕夏残阳落幕 提交于 2021-02-08 05:47:21

问题


Sometimes I see syntax like this.

template<typename T,typename = int>
int foo(){
    //...
}

what part typename = int mean? Where it can be used?


回答1:


foo has two template arguments. The first is called T and the second is unnamed and defaults to int.

In your piece of code alone there is no reason to use the second argument. Unnamed template arguments often come up with SFINAE. An example from cppreference:

// primary template handles non-referenceable types:
template<class T, class = void>
struct reference_traits {
    using add_lref = T;
    using add_rref = T;
};
 
// specialization recognizes referenceable types:
template<class T>
struct reference_traits<T, std::void_t<T&>> {
    using add_lref = T&;
    using add_rref = T&&;
};
 
template<class T>
using add_lvalue_reference_t = typename reference_traits<T>::add_lref;
 
template<class T>
using add_rvalue_reference_t = typename reference_traits<T>::add_rref;

The only reason for the primary template to have a second argument is that it can be specialized. When possible the more specialized specialization is instantiatied. If this fails (because T& is not valid) then "substitution failure is not an error" (SFINAE) kicks in and the primary template is instantiated instead.


A simpler example of unnamed argument is when you want a template argument merely as a tag to distinguish different instantiations:

template<typename = int>
struct bar {
    // ...
};

Even if the implementation of bar does not depend on the template argument you might want to have bar<double> and bar<std::string> be two distinct types.




回答2:


this is rarely used ...

but this is the default value for the typename but you don't need it here because the compiler itself can overload the function automatically and get the right type for the right arguments you passed !

also it type for what typename ? it's not makes sense here !

it used when you are using nested template ...

I found out in the original reference for C++ :

The template parameter lists of template template parameters can have their own default arguments, which are only in effect where the template template parameter itself is in scope:

// class template, with a type template parameter with a default
template<typename T = float> struct B {};
 
// template template parameter T has a parameter list, which 
// consists of one type template parameter with a default
template<template<typename = float> typename T> struct A
{
    void f();
    void g();
};
 
// out-of-body member function template definitions
template<template<typename TT> class T>
void A<T>::f()
{
    T<> t; // error: TT has no default in scope
}
template<template<typename TT = char> class T>
void A<T>::g()
{
    T<> t; // ok: t is T<char>
}

this is the link



来源:https://stackoverflow.com/questions/65491395/what-this-template-syntax-typename-t-mean

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!