2016-04-25 63 views
2

我有两个模板,一个作为参数传递给另一个。我希望能够使用主模板中参数的参数。或者,如果我有:从模板参数获取可变参数

template <typename T, typename... Args> 
class Foo 
{ 
    typedef T Type; 
    static void foo(Args... args) 
    { 
    } 
}; 

template <typename C> 
class Bar 
{ 
    void bar(Args... args) 
    { 
     // do something 
     C::foo(args...); 
    } 
}; 

我怎样才能让Args模板Bar可见。请注意,使用typedef T Type,我可以在Bar中使用C::Type。如果可能的话,可变参数的语法是什么?

+0

我见过这个。答案与indecies技巧有关。 http://stackoverflow.com/a/18993297/845092 –

+1

因为我想它是 – gsf

+0

[一个选项](http://coliru.stacked-crooked.com/a/974cb2d15ff09079) –

回答

3

这里一个可能的解决方案基于模板的模板参数:

template<typename T> 
class Bar; 

template <template<typename...> class C, typename... Args> 
class Bar<C<Args...>> { 
    void bar(Args... args) { 
     // do something 
     C<Args...>::foo(args...); 
    } 
}; 

您可以使用它,因为它如下:

Bar<Foo<int, double>> v; 

你不从CArgs直接得到的参数。相反,这个想法是利用这样一个事实,即C类本身是一个可变模板,因此从Bar的模板专用化的参数列表中获得Args

+0

这不回答这个问题,但它是我试图做的更好的选择 - 我将它标记为解决方案 – gsf

+0

@gsf嗯,实际上,您可以*使用主模板中参数的参数*。所以,它也确实回答了这个问题。 ;-) – skypjack

1

您可以使用包含Args...的'类型列表'的typedef。下面是使用tuple执行类型的角色列表的例子:

#include <tuple> 
#include <experimental/tuple> 

template <typename T, typename... Args> 
class Foo 
{ 
public: 
    using Type = T; 

    using Arguments = std::tuple<Args...>; 

    static void foo(Args... args) 
    { 
    } 
}; 

template <typename C> 
class Bar 
{ 
public: 
    void bar(typename C::Arguments &&args) 
    { 
     // do something 
     std::experimental::apply(C::foo, args); 
    } 
}; 

int main() { 
    Bar<Foo<int, double, float>> b; 
    b.bar(std::make_tuple(2.0, 1.0f)); 
} 

有了更多的元编程,应该可以产生Bar::bar函数,它直接基于C::Arguments参数。