Variadic模板和Alexandrescu元组实现

Ice*_*Pic 5 c++ variadic-templates

我尝试学习一些关于模板元编程的知识,目前我正在使用可变参数模板.

在他的演讲"Variadic模板是Funadic"中,Alexandrescu引入了一个小元组实现,我尝试构建并可能延伸一点.(我知道这是一个玩具的例子,我只是想学习更多关于c ++的知识).但是,我的代码有一个小问题.

这里是:

template <typename... Ts> 
class tuple
{};

template<size_t, typename> struct tuple_element;

template<typename T, typename... Ts>
struct tuple_element<0, tuple<T, Ts...>> 
{
    typedef T type;
};

template <size_t k, typename T, typename... Ts>
struct tuple_element<k, tuple<T, Ts...>> 
{
    typedef 
       typename tuple_element<k-1,tuple<Ts...>>::type type;
};

template<size_t k, typename... Ts>
typename std::enable_if<k == 0, 
                        typename tuple_element<0,tuple<Ts...>>::type&>::type
   get(tuple<Ts...>& t)
{return t.head_;}

template<size_t k, typename T, typename... Ts>
typename std::enable_if<k != 0,
                        typename tuple_element<k,tuple<T,Ts...>>::type&>::type
   get(tuple<T,Ts...>& t)
{
    tuple<Ts...> & super = t;
    return get<k-1>(super);
}

template <typename T, typename... Ts>
class tuple<T,Ts...> : private tuple<Ts...> 
{
private:
   T head_;

};

int main(int argc, char *argv[])
{   
     tuple<int,std::string> t;
     get<0>(t) = 10;
     get<1>(t) = std::string("test");
     std::cout<<get<0>(t)<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

为了正常工作,get函数必须是元组类的朋友(在本幻灯片中也提到了它,参见32).但朋友宣言怎么样?我尝试了不同的方法,但无法让它发挥作用.当我将代码从私有继承更改为公共继承并将head_的访问规则更改为public时,它可以正常工作.

谢谢你的帮助

凯文

T.C*_*.C. 4

这对我有用:

template <typename T, typename... Ts>
class tuple<T,Ts...> : private tuple<Ts...> 
{
private:
   T head_;

   template<size_t k, typename T1, typename... T1s>
   friend typename std::enable_if<k != 0,
                        typename tuple_element<k,tuple<T1,T1s...>>::type&>::type
   get(tuple<T1,T1s...>& t);

   template<size_t k, typename... T1s>
   friend typename std::enable_if<k == 0, 
                        typename tuple_element<0,tuple<T1s...>>::type&>::type
   get(tuple<T1s...>& t);

};
Run Code Online (Sandbox Code Playgroud)

演示