问题说什么。另外,是否可以内联执行此操作?
这是一个小例子,只是为了给出一个想法......
template<typename T>
class Foo {
public:
Foo() :z(0.0) {}
void do( const Foo<T> &f ) {
z = f.z;
}
// specialize 'do' for Foo<int>, possible inline?
private:
T z;
};
问题说什么。另外,是否可以内联执行此操作?
这是一个小例子,只是为了给出一个想法......
template<typename T>
class Foo {
public:
Foo() :z(0.0) {}
void do( const Foo<T> &f ) {
z = f.z;
}
// specialize 'do' for Foo<int>, possible inline?
private:
T z;
};
你不需要做任何复杂的事情。只需使用重载和委托。请注意,我们不能只添加一个int
重载,因为如果T
结果int
也是如此,这将是一个无效的重载(具有相同签名的两个函数)
template<typename T>
class Foo {
public:
Foo() :z(0.0) {}
void doIt(const Foo<T> &f ) {
doItImpl(f);
}
private:
template<typename U>
void doItImpl(const Foo<U> &f) {
z = f.z;
}
void doItImpl(const Foo<int> &f) {
/* ... */
}
private:
T z;
};
或者,对于这种情况,您可以通过专业化来做到这一点
template<typename T>
class Foo {
public:
Foo() :z(0.0) {}
void doIt(const Foo<T> &f ) {
z = f.z;
}
private:
T z;
};
template<>
inline void Foo<int>::doIt(const Foo<int> &f) {
/* ... */
}
只有当所有模板参数都固定时,才能以这种方式使用特化。换句话说,部分特化成员函数是不可能的。
您可以通过使成员函数成为成员函数模板并使用 SFINAE 来获得这种行为(替换失败不是错误)。例如:
template <typename U>
typename std::enable_if<!std::is_integral<U>::value &&
std::is_same<T, U>::value, void>::type
f(const Foo<U>& x)
{
}
template <typename U>
typename std::enable_if<std::is_integral<U>::value &&
std::is_same<T, U>::value, void>::type
f(const Foo<U>& x)
{
}
is_integral
type trait 测试是否是U
整数类型。如果不是,则实例化第一个;如果是,则实例化第二个。
is_same
类型特征测试以确保T
和U
是相同的类型。这用于确保成员函数模板不会被实例化为除Foo<T>
.
这个例子使用了 C++0x<type_traits>
库;Boost 还有一个你可以使用的类型特征库,它的工作原理基本相同。
您可以尝试做这样的事情(没有测试,可能不起作用):
template<typename T>
class Foo {
public:
Foo() :z(0.0) {}
template<typename Ty = T>
void do( const Foo<T> &f ) {
z = f.z;
}
template<>
void do<int>( const Foo<T> &f ) {
//specialized code
}
private:
T z;
};