2011-09-25 130 views
0

有没有方法可以为模板类的方法提供默认参数值?例如,我有以下几点:模板类的方法的默认参数

template<class T> 
class A 
{ 
public: 
    A foo(T t); 
}; 

我应该如何修改这个给fooT类型的默认参数?例如:Tint则默认值为-23,或者Tchar*,则默认值为"something"等。这甚至可能吗?

回答

3

如果您希望默认参数只是默认值(通常为零),那么您可以编写A foo(T t = T())。否则,我建议特质类:

template <typename T> struct MyDefaults 
{ 
    static const T value = T(); 
}; 

template <> struct MyDefaults<int> 
{ 
    static const int value = -23; 
}; 


template<class T> 
class A 
{ 
public: 
    A foo(T t = MyDefaults<T>::value); 
}; 

编写的类定义只适用于整数类型内部的恒定值,我相信,所以你可能把它外面写的所有其他类型:

template <> struct MyDefaults<double> 
{ 
    static const double value; 
}; 
const double MyDefaults<double>::value = -1.5; 

template <> struct MyDefaults<const char *> 
{ 
    static const char * const value; 
}; 
const char * const MyDefaults<const char *>::value = "Hello World"; 

在C++ 11,你可以或者可以说出static constexpr T value = T();,使非整数值的模板工作,前提是T有一个声明constexpr默认构造函数:

template <typename T> struct MyDefaults 
{ 
    static constexpr T value = T(); 
}; 

template <> struct MyDefaults<const char *> 
{ 
    static constexpr const char * value = "Hello World"; 
}; 
+0

你也可以使价值成为一个静态成员函数。 –