2015-07-03 76 views
4

我深化發展一個某種形式的元組結構,我想允許用戶使用其元素領域,命名元組元素

解釋:

這是我的元組:

template<typename ...Ts> 
struct myTuple{ 
    std::tuple<Ts...> data; 

    template<size_t I> 
    inline type<I>& get_t() { // type<I> is the I'th type 
     return std::get<I>(data); 
    } 

    // Other stuff 
}; 

就目前而言,用戶可以擁有這樣說:

struct UserStruct{ 
    myTuple<int,bool,string> t; 
    // Other stuff 
} 

,並使用它像,

UserStruct ob; 
ob.t.get_t<0>() = 0; 

這是一個有點複雜......所以我做它這樣

struct UserStruct{ 
    myTuple<int,bool,string> t; 

    decltype(mo.get_t<0>()) myInt() { 
     return mo.get_t<0>(); 
    } 

    decltype(t.get_t<1>()) myChar() { 
     return t.get_t<1>(); 
    } 

    decltype(t.get_t<2>()) myString() { 
     return t.get_t<2>(); 
    } 
}; 

這樣他就可以直接使用它:敏()= 0;

我的目標是,他可以使用元組,如果他有一個int, bool, string數據成員不存儲引用,這意味着我需要一個函數(或仿函數)來獲得引用,所以我的解決方案是好的,但它需要用戶定義功能。 (和吸氣劑真正的代碼看起來更糟糕)

所以我想是這樣的:

struct UserStruct{ 
    myTuple<int,bool,string> t; 

    MyFunctor<0> myInt; //or an alias to a function 

    MyFunctor<1> myChar; 

    MyFunctor<2> myString; 
}; 
+0

你可以使用C++ 14嗎?它有'std :: get ()'。 – Biffen

+0

我已經在使用它,我添加了標籤 –

+2

如果元組有2個字符串或2個字符或2個整數會怎麼樣?你將如何區分它們?我對Herb Sutter有一個模糊的記憶,內容是關於將來的C++版本允許別名用於std :: get,所以你可以命名索引。我不確定它的情況。 – Robinson

回答

2

類似的代碼MyFunctor<0> myInt;不能工作,但無仿函數提供T作爲舒服,所以它知道哪些元組鏈接到。但是,您可以添加一個宏來爲您構建將假設元組名稱爲t(或將其提供給宏)的訪問器。

#define LINK_MEMBER(ID, NAME) decltype(t.get_t<ID>()) NAME() { \ 
    return t.get_t<ID>();           \ 
} 

那麼你的代碼看起來像

struct UserStruct{ 
    myTuple<int,bool,string> t; 
    LINK_MEMBER(0, myInt); //or an alias to a function 
    LINK_MEMBER(1, myChar); 
    LINK_MEMBER(2, myString); 
}; 
+0

謝謝你,我會用這個,直到我找到一個沒有宏的解決方案 –

+2

在我看來,你也可以爲結構的整個主體制作更宏偉的宏,你會像'BUILD_MEMBERS(int,myInt,char, myChar,string,myString);'然後它可以爲你組裝元組,你只需要擔心命名每個條目並指出它是類型。 (如果我可以跨越多行,這看起來會好得多。) –

+0

我需要一個帶可變參數的宏 –

0

爲什麼寫myInt()時,你可以寫my<int>()?這是一個字符,並允許你只寫:

template<typename ...Ts> 
struct myTuple{ 
    std::tuple<Ts...> data; 

    template <size_t I> 
    decltype(auto) my() { return std::get<I>(data); } 

    template <typename T> 
    decltype(auto) my() { return std::get<T>(data); } 
}; 

using UserStruct = myTuple<int, bool, std::string>; 

不需要別名函數,宏等,同時也很好,簡潔。

+0

myInt只是一個例子,我的意思是一種讓用戶命名訪問者的方法。這正是元組的問題,這是人們想給他們的變量賦予一些意義,而不是使用獲得

+0

@OthmanBenchekroun如果你想給出有意義的名字,只需寫一個struct:struct UserStruct {int myInt; bool myBool;字符串myString; };'爲什麼你甚至需要'tuple'? – Barry

+0

這是一個特殊的結構,我需要直系 –