我正在使用BSD文件描述符读取和和管道(与read
和write
电话)写值的代码。这是一个简单的IPC系统的一部分,其中一个进程告诉另一个进程运行并返回结果。大多数情况下,只有一个返回值,但是一些过程需要返回多个返回值。为了避免为每个人都做一个新的struct
,我想我可以使用std::tuple
s。如何将一个可变数量的值读入std :: tuple?
不过,我只有很少的成功创建读元素融入一个元组的一般方法。我试图单独读取这些值,因为这两个进程没有相同的位数(一个是64位,另一个是32位),我担心tuple
结构中的不同对齐要求会导致它们不兼容。这是我的尝试:
template<typename TTupleType>
struct TupleReader
{
int fd;
TTupleType& storage;
TupleReader(int fd, TTupleType& storage) : fd(fd), storage(storage)
{ }
template<size_t Index = std::tuple_size<TTupleType>::value - 1>
inline void Read()
{
Read<Index - 1>(fd);
auto& ref = std::get<Index>(storage);
::read(fd, &ref, sizeof ref);
}
};
这显然不能编译,因为它试图实例Read<-1>
和STL的实现我用渔获std::get<-1>
有static_assert
。但是,在类范围中专门化模板化函数是非法的,但由于父项struct
也是模板化的,因此无法将方法专门化到其他范围之外。 template<typename TTupleReader> void TupleReader<TTupleType>::Read<0>()
被认为是部分专业化。
所以看起来我被这种方法陷入了僵局。有没有人看到一种方法来做到这一点?
很聪明。我会尝试的。 – zneak 2013-04-27 14:47:56