[英]How to specialize member functions based on class template argument
問題怎么說。 此外,可以內聯嗎?
這是一個簡單的例子,僅供參考...
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
類型特征測試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;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.