任何代碼,我有下面的類:模板時,沒有任何類型的共同點
class ValueSetter: public IValueSetter
{
public:
explicit ValueSetter(CContainer* container)
: _container(container)
{
}
virtual void operator()(const int value, const int index) const
{
_container->values[index].value.i = value;
}
virtual void operator()(const double value, const int index) const
{
_container->values[index].value.d = value;
}
virtual void operator()(const std::string& value, const int index) const
{
...
_container->values[index].value.s = _strdup(value.c_str());
}
private:
CContainer* _container;
};
該類上CContainer存儲在工會的緩衝它的數據進行操作。我將ValueSetter傳遞給沒有CContainer知識的Container類。事實上,未來我希望CContainer(我通過C API獲得的)將消失,並且值被組織在std :: vector或std :: list中。我的容器的界面不需要因此而改變,不應該關心數據如何存儲在內存中。
考慮到這一點,我不是喜歡的東西大致沿着這些線路:
class IntValueSetter: public IIntValueSetter
{
public:
explicit IntValueSetter(Container* container)
: _container(container)
{
}
virtual void operator()(const int value, const int index) const
{
_container->values[index].value.i = value;
}
private:
CContainer_3* _container;
}
或:
class IntValueSetter: public IIntValueSetter
{
public:
explicit IntValueSetter(std::vector<int> values)
: _values(values)
{
}
...
}
但我需要能夠如下使用它們:
ValueSetter<int> valueSetter;
,而不是
IntValueSetter valueSetter;
我該怎麼做?
你會怎麼做,以避免一個IIntValueSetter接口,而不是使用IValueSetter接口作爲基地 –
Baz
我不知道;你還沒有談過這件事。但正如你所建議的那樣,模板可能是正確的答案。 –
我在這個問題中添加了自己的答案,其中顯示了接口的兩個實現。 – Baz