从模板参数中获取可变参数
Get the variadic arguments from template argument
我有两个模板,一个作为参数传递给另一个。我希望能够使用主模板中参数中的 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
,我可以在 Bar
中使用 C::Type
。如果可能,可变参数的语法是什么?
这里有一个基于模板模板参数的可能解决方案:
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;
您不会直接从 C
class 中获取参数 Args
。相反,这个想法是利用 C
class 本身就是一个可变参数模板这一事实,从而从 Bar
的模板特化的参数列表中获得 Args
.
您可以为 'type list' 包装 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
.
接受参数
我有两个模板,一个作为参数传递给另一个。我希望能够使用主模板中参数中的 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
,我可以在 Bar
中使用 C::Type
。如果可能,可变参数的语法是什么?
这里有一个基于模板模板参数的可能解决方案:
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;
您不会直接从 C
class 中获取参数 Args
。相反,这个想法是利用 C
class 本身就是一个可变参数模板这一事实,从而从 Bar
的模板特化的参数列表中获得 Args
.
您可以为 'type list' 包装 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
.