希望stackoverflow社区可以帮助我解决这个问题。我想有类似下面的编译
template <typename A>
void VARIADIC_TEMPLATE_FUNCTION(A* tptr)
{
//Do nothing
}
template <typename A, typename B, typename... C>
void VARIADIC_TEMPLATE_FUNCTION(A* tptr)
{
// Do stuff here with typename B and tptr (not included)
VARIADIC_TEMPLATE_FUNCTION<A,C...>(tptr);
}
显然这不起作用,两个功能的签名冲突。
我一直试图通过传递一些可变参数来解决这个问题,但似乎没有任何工作。我不反对传递“假”变量 - 但不愿意。
调用者会做类似的事情:(例如):
ClassP* ptr;
VARIADIC_TEMPLATE_FUNCTION<ClassP, ClassA, ClassB, ClassC, ClassD>(ptr);
答案 0 :(得分:2)
你编写的代码对我来说完全没问题,所以我不完全确定问题是什么。但是,如果您要表达的是对包中的每种类型执行某些操作,我喜欢以下方法:
template <typename B, typename A>
void impl(A* tptr) {
// Do stuff here with typename B and tptr (not included)
}
template <typename A, typename... Ts>
void VARIADIC_TEMPLATE_FUNCTION(A* tptr) {
int unused[] = {0, (impl<Ts>(a), 0)... };
(void)unused;
}
一旦你越过了我们正在引入的int
奇怪的0
数组,我就会更清楚地表达意图。
答案 1 :(得分:0)
将其变为可以专攻的struct
:
template<typename...> struct IMPL;
template <typename A>
struct IMPL<A>
{
static void apply(A* tptr)
{
//Do nothing
}
};
template <typename A, typename B, typename... C>
struct IMPL<A,B,C...>
{
static void apply(A* tptr)
{
// Do stuff here with typename B and tptr (not included)
IMPL<A,C...>::apply(tptr);
}
};
template <typename A, typename... Ts>
void VARIADIC_TEMPLATE_FUNCTION(A* tptr)
{
IMPL<A,Ts...>::apply(tptr);
}