当所有类型都没有任何公共代码时使用模板
Using template when none of the types have any code in common
我有以下类:
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;
我该怎么做?
只做显而易见的事情。没有要求模板专业化与另一个专业化或原始模板有任何共同点。因此:
class IIntValueSetter {
};
template <class Ty> class ValueSetter; // declared but not defined
template <>
class ValueSetter<int> : public IIntValueSetter {
// whatever
};
ValueSetter<int> vsi;
如果我说得对,您只需要编写一个类模板:
template <typename T>
class ValueSetter
{
public:
explicit ValueSetter(std::vector<T> values): _values(values)
{
}
virtual void operator()(const T value, const int index) const
{
_container->values[index].value.i = value;
}
// etc.
};
我想我在找这样的东西。我在下面只实现了int,但每个类型都有自己的接口类和实现类。我很想听听你对这种方法的评论!
template<typename V>
class IValueSetter
{
public:
};
template<>
class IValueSetter<std::string>
{
public:
virtual void operator()(const std::string& value, int index) const = 0;
};
template<typename V>
class ValueSetter
{
};
template<>
class ValueSetter<std::string>: public IValueSetter<std::string>
{
public:
explicit ValueSetter2(CContainer* container)
: _container(container)
{
}
void operator()(const std::string& value, int index) const
{
_container->values[index].value.s = _strdup(value.c_str());
}
private:
CContainer* _container;
};
template<>
class NewValueSetter<std::string>: public IValueSetter<std::string>
{
public:
explicit NewValueSetter(std::shared_ptr<std::list<std::string>> values)
: _values(values)
{
}
void operator()(const std::string& value, int index) const
{
(*values)[index] = value;
}
private:
std::shared_ptr<std::list<std::string>> _values;
};
相关文章:
- 代码编译没有任何输出,入门程序
- 可能我知道为什么这段代码没有给出任何输出吗?
- 执行此代码时,它不显示任何输出.为什么?
- 是给定代码中的任何更改,以便我可以为问题提供正确的输出
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 我觉得我放入结构中的输入代码可以压缩,关于如何在保持代码简短的同时保持数据个性化的任何建议?
- 我最近更改了编译器路径以运行 c++ 代码,但现在我无法运行任何 python 代码。我该如何解决这个问题?
- 为什么 C++ 中的分号在插入代码开头时不显示任何错误?
- 为什么我的代码在终端中没有输出任何内容.开始新行没有错误
- 为什么这段代码非常慢?任何与缓存行为有关的事情?
- 如果代码中没有连接任何插槽,是否有理由发出Qt信号?
- 这会对代码产生任何影响吗?
- 为什么当从面向任何 CPU 的 C# 项目调用此代码时,此代码会引发 System.AccessViolationExc
- 为什么<<低;和 cout<<v.begin;单独给出错误,但 cout <<(lower.begin());没有给出任何错误,并使代码易于编译
- 是否有任何编译器标志可以在下面的代码中用于报告有关 UB 的警告?
- 为什么我在链表中插入的代码没有得到任何输出?
- 代码不会处理任何异常
- 如何创建我稍后在代码中定义大小的任何数组?
- 我的递归可以吗?是否有任何破坏代码的示例?
- 我是否需要处理以下代码中的任何错误情况?