【发布时间】:2018-12-18 13:21:24
【问题描述】:
要使问题标题更有意义,请考虑以下代码:
template <typename T>
void write(const T& /*data*/)
{
// use data as const
}
template <typename T>
void read(T& /*data*/)
{
// modify data
}
struct S {
int a;
int b;
// a lot of primitive types here
};
void output(const S& s)
{
write(s.a);
write(s.b);
// ...
}
void input(S& s)
{
read(s.a);
read(s.b);
// ...
}
int main()
{
S s;
input(s);
output(s);
}
我有 write 和 read 函数来操作原始数据,例如 int、double 等。我有几个结构类型,例如 S,其中包含很多原始数据成员,我需要输入并通过相应的函数input 和output 输出此类类型(不同类型有许多重载)。如您所见,output 和input 函数的内容基本相同,只是内部函数和类型常量不同。我想做一些通用(模板)函数use 来消除input/output 函数中的代码重复。
我认为模板签名如下(但我可能会遗漏一些东西):
template <typename F, typename T>
void use(T& t) { ... }
所以我可以像这样从input/output 调用use 函数:
use<write, S>(s); // in output function
use<read, S>(s); // in input fuction
如何归档这种(或类似的)行为以消除代码重复?我正在使用 C++14。
【问题讨论】:
-
不能只是
use(T t)并让T成为T&或const T&适当吗? -
您认为
use<write, S>(s)优于write(s)(甚至更明确的write<S>(s))的依据是什么? -
@Peter:简单,想象一下结构的序列化/反序列化代码。您想列出成员一次,而不是两次。
-
FWIW,如果你想序列化一堆不同的类型,请查看 boost serialize:boost.org/doc/libs/1_68_0/libs/serialization/doc/index.html
-
@VittorioRomeo - 我明白这个问题是关于什么的。但是所寻求的解决方案仍然要求进行读写操作的语句是不同的。成员可能只列出一次,但它们用于更复杂的语句中,读取和写入必须不同。