变体模板功能组合

时间:2015-04-28 15:47:36

标签: c++ c++11 recursion variadic-templates c++14

希望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);

2 个答案:

答案 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);
}