我非常希望能夠提供仿函數作爲模板參數。函數必須能夠提供「自己」作爲該論證。模板仿函數必須提供自己作爲模板參數
我想是這樣的:
template<typename T, template<typename> class SumFunctor> class foo;
template<typename T>
struct sum_default
{
foo<T, sum_default> operator()(foo<T, sum_default> a, foo<T, sum_default> b) const
{
T a_data = a.data();
T b_data = b.data();
return foo<T, sum_default>(a_data + b_data);
}
};
template<typename T>
struct sum_awesome
{
foo<T, sum_awesome> operator()(foo<T, sum_awesome> a, foo<T, sum_awesome> b) const
{
T a_data = a.data();
T b_data = b.data();
return foo<T, sum_awesome>(a_data - b_data);
}
};
template<typename T=int, template<typename> class SumFunctor=sum_default>
class foo
{
private:
T _data;
SumFunctor<T> _functor;
public:
foo<T, SumFunctor>(T data) : _data(data) {}
T data() { return _data; }
friend const foo operator +(const foo& lhs, const foo& rhs)
{
return lhs._functor(lhs,rhs);
}
};
int main(){
foo<> a(42);
foo<double> b(1.0);
foo<double,sum_default> c(4.0);
foo<double,sum_awesome> d(4.0);
a+a;
d+d;
}
這是可能的,如果是這樣,怎麼樣?
另一種解決方案是爲構造函數提供函子,但是我認爲這非常難看,因爲用戶必須自己動態地分配函數(因爲我們無法確定構造函數中的函數的類型。這樣做似乎也有點難看):
foo<double> a(42, new sum_default<double>());
這也迫使從一些預先定義的基本算符派生的所有仿函數。
UPDATE
試圖模板參數添加到sum_default模板參數沒有出現要解決的問題:
template<typename T>
struct sum_default
{
// Error 1 error C3200: 'sum_default<T>' : invalid template argument for template parameter 'SumFunctor', expected a class template
foo<T, sum_default<T> > operator()(foo<T, sum_default<T> > a, foo<T, sum_default<T> > b) const
{
T a_data = a.data();
T b_data = b.data();
return foo<T, sum_default<T> >(a_data + b_data);
}
};
謝謝您迴應,但你所建議的不會編譯。 – user1202032 2012-04-26 18:22:19
好的。我在問題中添加了錯誤。如果您可以提供關於如何解決我的定義順序的幫助,將會大大受益。 – user1202032 2012-04-26 18:30:44
對不起,我最初誤解了你的代碼的意圖。對不起,噪音。 : - ] – ildjarn 2012-04-26 18:40:12