Template类,并强制某些方法由User实现
Template class and forcing certain methods to be implemented by User
可能的重复:
是否可以编写C++模板来检查函数';的存在?
我正在尝试编写一个C++类模板。我想要的是,当这个类模板与用户定义类一起使用时,我想强制这些用户定义类实现某些方法,例如to_data
和from_data
。我不希望那些用于基本C++基元数据类型。我该怎么做?例如,如果类的复制构造函数不可用,std::vector
会给出编译错误。
您可以使必须由用户实现的方法成为纯虚拟函数。如果您不希望那些用于基本C++基元数据类型,您可以针对这些情况专门化您的模板,并为这些情况提供默认实现。
只需使用类模板中的方法:
template <typename T>
struct Serializer
{
void serialize(T const & t) const { write(t.to_data()); }
void deserialize(T & t) const { t.from_data(read()); }
};
如果实例化模板的类型具有适当的成员函数,那么一切都会好起来。如果他们不这样做,编译器将触发一个错误:
struct Foo
{
int val;
int to_data() const { return val; }
void from_data(int i) { val = i; }
};
struct Bar {};
Serializer<Foo> sf;
sf.serialize(); // OK
Serializer<Bar> sb;
sb.serialize(); // compiler error: Bar has no member function named "to_data"
请注意,只有当我们尝试使用类模板的某些函数时,才会触发编译器错误。这是因为类模板的成员函数只有在使用它们时才会实例化(如果愿意的话,可以编译)。因此,只要不使用serialize
和deserialize
成员函数,就可以用Bar
实例化Serializer
。
关于第二个问题,即如何为基元类型提供不同的行为,您有几个解决方案。第一种方法是将类模板专门化为您想要以不同方式处理的类型。例如,下面的代码专门处理Serializer
,以便以不同的方式处理int
:
template <>
struct Serializer<int>
{
void serialize(int i) const { write(i); }
void deserialize(int & i) const { i = read();
};
然而,这意味着为每种特定类型编写一个专门化,即使其中一些类型实际上是以相同的方式处理的。
一个不那么麻烦的解决方案是使用类型特征和std::enable_if
来根据参数类型的一些特征(在这种情况下,无论它们是否原始)选择正确的实现:
#include <type_traits>
template <typename T, typename Enable = void>
struct Serializer
{
// same as before
};
// Partial specialization for fundamental types
template <typename T>
struct Serializer<T, typename
std::enable_if<std::is_fundamental<T>::value>::type>
{
void serialize(T t) const { write(t); }
void deserialize(T & t) const { t = read(); }
};
Serializer<Foo> sf; // first implementation
Serializer<int> si; // second (specialized) implementation
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- Template类,并强制某些方法由User实现