2016-04-25 35 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參數。