2013-04-27 57 views
1

我正在使用BSD文件描述符讀取和和管道(與readwrite電話)寫值的代碼。這是一個簡單的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>()被認爲是部分專業化。

所以看起來我被這種方法陷入了僵局。有沒有人看到一種方法來做到這一點?

回答

4

你可以嘗試使用索引:

template< std::size_t... Ns > 
struct indices 
{ 
    typedef indices< Ns..., sizeof...(Ns) > next; 
}; 

template< std::size_t N > 
struct make_indices 
{ 
    typedef typename make_indices< N - 1 >::type::next type; 
}; 

template<> 
struct make_indices<0> 
{ 
    typedef indices<> type; 
}; 

struct sink 
{ 
    template<typename... T> 
    sink(T&&...) {} 
}; 

template<typename TTupleType> 
struct TupleReader 
{ 
    int fd; 
    TTupleType& storage; 

    TupleReader(int fd, TTupleType& storage) : fd(fd), storage(storage) 
    { } 

    template<size_t... Ns> 
    inline void ReadImpl(const indices<Ns...>&) 
    { 
     sink { ::read(fd, &std::get<Ns>(storage), 
          sizeof(typename std::tuple_element<Ns,TTupleType>::type))... }; 
    } 

    inline void Read() 
    { 
     ReadImpl(typename make_indices<std::tuple_size<TTupleType>::value>::type()); 
    } 
}; 
+0

很聰明。我會嘗試的。 – zneak 2013-04-27 14:47:56

0

您可以創建一個內部模板類TupleReader::Reader<i>包含單個靜態函數Read。然後,您可以根據需要部分專門化該內部類的<i=0>大小寫。然後TupleReader::Read<n>可以實例化TupleReader::Reader<n>並調用靜態函數TupleReader::Reader<n>::Read

相關問題