【发布时间】:2013-12-26 17:10:58
【问题描述】:
我有一个模板Property,它包装数据并提供其他服务。此模板专门用于基本数据(float、int_32、bool...),并且存在另一种用于基本类型向量的规范。比如:
template<typename T>
Property : public PropertyBase
{
public:
// Base types specilization.
void operator=(T const & data);
}
template<typename T>
Property<std::vector<T> > : public PropertyBase
{
public:
// Specilization for vectors of base types.
T const & operator[](std::size_t i) const;
}
关于基本数据的规范,我重载了operator=,以便在数据更改后调用回调。关于向量的特殊化,我重载了 operator[] 以获取对向量第 i 个元素的索引访问。
现在我想在基本类型上获得与 operator= 类似的行为,但我对向量的专长。我被困住了。我想做的是:
Property<std::vector<float> > myProp;
myProp[5] = 5.21f;
并期望在分配发生后调用回调。
问题是myProp[5]返回一个float,回调机制不是为float定义而是Property。
当然我可以写一个索引setter函数比如
template<typename T>
Property<std::vector<T> > : public PropertyBase
{
public:
// Specilization for vectors of base types.
T const & operator[](std::size_t i) const;
void set(int i, T const & newValue);
}
但是使用 setter 的语法并不像我期望的那样干净。
我也可以在operator[] 中调用回调,但是回调是在分配之前调用的,而不是之后。
任何人都想获得这种简洁的语法,同时仍然能够在分配后调用我的回调?
谢谢!
PS:请注意,我的 Property 模板比所写的更复杂,并检查 T 是否为基本类型(此处未完成),但这与我的问题。
【问题讨论】:
-
我相信您将不得不为 operator= 编写另一个重载,它将显式采用浮点类型。您如何区分 T 和 float (因为您的“数据”参数实际上可以是任何东西)?
-
确保阅读More Effective C++的第30条
标签: c++ templates c++11 operator-overloading