【发布时间】:2012-04-26 18:10:47
【问题描述】:
我非常希望能够提供一个仿函数作为模板参数。函子必须能够提供“他们自己”作为该参数。
我想像这样:
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;
}
这可能吗?如果可以,怎么做?
另一种解决方案是向构造函数提供仿函数,但我认为这非常难看,因为用户必须自己动态分配仿函数(因为我们无法确定构造函数中仿函数的类型。使用 RTTI 来做所以看起来也有点丑):
foo<double> a(42, new sum_default<double>() );
这也强制所有函子派生自某个预定义的基本函子。
更新
尝试将模板参数添加到 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);
}
};
【问题讨论】:
-
感谢您的回复,但您的建议无法编译。
-
好的。我将错误添加到问题中。如果您能就如何修正我的定义顺序提供帮助,将不胜感激。
-
对不起,我最初误解了您的代码的意图。对不起,噪音。 :-]
标签: c++ templates constructor functor