如果我有:
template <class T>
class A
{
static void f()
{
// not using template parameter T
}
};
在这种情况下,A<int>::f()
与A<double>::f()
相同,但我不希望通过模板参数调用A::f()
。是否存在允许调用f()
但不需要模板参数的语法?
答案 0 :(得分:16)
编译器不知道A<T>::f()
不使用类型参数T
。事实上,只要您使用f
,就必须为编译器提供类型。
但是当我设计一个模板类时,我注意到某些成员/方法不依赖于模板参数,我会经常将它们移到非模板基类。
class A_Base {
public:
static void f();
};
template <class T> class A : public A_Base {
// ...
};
现在A_Base::f()
,A<int>::f()
和A<double>::f()
真的都是一样的。
答案 1 :(得分:2)
f
成为静态方法。让它成为一个免费的功能。如果由于某种原因必须使其成为静态方法,请根据自由函数实现它,并且只需调用它。答案 2 :(得分:1)
否 - 如果您不想使用模板参数,请不要使用模板参数声明该类。如果您需要该类的其他成员的模板参数,但在f
中不需要它,则将f
移出该类。
答案 3 :(得分:1)
不确定。通过将其指定给函数指针来为它赋予别名。
答案 4 :(得分:0)
不,实际上A<int>::f()
与A<any_other_type>::f()
不同。他们真的不一样。如果希望f()
真正独立于参数,可以使模板类A
继承自另一个提供f()
的类作为静态成员函数的类(有时称为特征) :
struct X
{
static void f() { ...}
};
template <typename T>
struct A : X
{
...
然后,您可以拨打A<type>::f()
或X::f()
。
答案 5 :(得分:0)
一个简单的解决方法(如果你不想使用继承而你不想让它成为非成员函数),你可以为你的类指定一个默认类型:
template <class T = bool>
class A
{
public:
static void f() { cout << "f()" << endl; }
};
int main(void)
{
A<>::f();
return 0;
}
注意:此方法与,A<int>::f()
或A<long>::f()
等不同,但如果您在函数中没有类型依赖项 - 那么上面的方法可以正常工作...
答案 6 :(得分:0)
每个类模板实例化都有其自己的任何静态数据成员的副本。静态声明可以是模板参数类型,也可以是任何定义的类型。
您必须分别定义静态成员。下面的示例演示了这一点:
template <class T> class K
{
public:
static T x;
};
template <class T> T K<T> ::x;
int main()
{
K<int>::x = 0;
}
语句模板T K :: x定义了类K的静态成员,而main()函数中的语句为K的数据成员分配了一个值。