指定默认模板参数

Joe*_*Joe 3 c++ templates c++11

假设我有一个模板函数,如:

template<typename T, typename DType=uint32_t>
void fun(T a) {
    //...
    // DType is used inside
}
Run Code Online (Sandbox Code Playgroud)

我如何指定类型DType,但是T可以由编译器推断,例如:

fun<DType=int32_t>(static_cast<std::string>(s));
Run Code Online (Sandbox Code Playgroud)

vso*_*tco 6

正如你所写,你做不到.你最好的选择是交换类型,让编译器推断出类型T,比如

template<typename DType=uint32_t, typename T>
void fun(T a) {
    //...
    // DType is used inside
}
Run Code Online (Sandbox Code Playgroud)

编译器将相应地推断出类型T.

#include <iostream>

template<typename DType = uint32_t, typename T>
void fun(T a) {
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}

int main()
{
    fun<char>(42); // T is deduced as int, DType as char
}
Run Code Online (Sandbox Code Playgroud)

正如@TC在评论中提到的那样:"与类模板不同,不要求函数模板的默认模板参数在尾随模板参数上."

Live on Coliru

  • `template <typename DType = uint32_t,typename T> void fun(T);`与类模板不同,不要求函数模板的默认模板参数在尾随模板参数上. (3认同)