我正在使用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