与必须由模板用户指定的类模板参数不同, function 模板参数由编译器推导出来。因此,出现了一个自然的问题:为什么可能需要指定默认函数模板参数?
我可以想到的一种用法是当我们想要强制一些函数模板参数而不需要指定所有这些参数时。然而,这似乎是一个极端的案例。还有其他案例吗?
答案 0 :(得分:0)
这可能是部分答案。我想到的一个用途是当我们有一个模板参数,它不会在函数的参数列表中显示为类型,因此无法推导出来。为该模板参数提供默认参数可能非常合理。上述评论是在上午提供了这种用法的一个很好的例子。
答案 1 :(得分:0)
尝试将以下func
转换为constructor
(他们没有返回类型)。
template<class T>
typename std::enable_if< std::is_fundamental<T>::value >::type func(T p_arg){}
template<class T>
typename std::enable_if< !std::is_fundamental<T>::value >::type func(T const &p_arg){}
使用默认的函数模板参数非常简单。
答案 2 :(得分:-1)
示例:
template <typename Y, typename Y, int Z>
class Do{};
X,Y,Z是模板参数。
用户可以使用它:
Do<int,int,1> doit;
使用类模板时,无法从函数参数中推导出模板参数。
你打电话给某事&#34;默认&#34;参数...
template <typename Y, typename Y, int Z=9>
class Do{};
如果使用代码没有给出,则Z默认为9,如下:
Do<int,int> doit;
如果你的模板参数可以从函数参数中推断出来,那么用户可能想要使用一个特殊的模板实例,如:
template <typename T>
void func( const T&);
template<>
void func( const int& )
{
std::cout << "int in use" << std::endl;
}
template<>
void func( const double&)
{
std::cout << "double in use" << std::endl;
}
int main()
{
func(3.4); // calls double
func<int>(3.4); //calls int
}