我有两个模板,一个作为参数传递给另一个。我希望能够在主模板中使用参数中的Args。或者如果我有:
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
,我可以在C::Type
中使用Bar
。如果可能的话,variadic参数的语法是什么?
答案 0 :(得分:4)
这是一个基于模板模板参数的可能解决方案:
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;
您没有直接从Args
类获取参数C
。相反,我们的想法是利用C
类本身就是一个可变模板的事实,从而从Args
的模板特化的参数列表中获取Bar
。
答案 1 :(得分:1)
您可以为&#39;类型列表提供typedef&#39;包裹Args...
。以下是使用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
获取参数。