2015-04-28 6 views
-2

Надеюсь, что сообщество stackoverflow поможет мне с этой проблемой. Я хотел бы иметь что-то вроде следующего компилироватьСостав шаблона шаблонов Variadic

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

И в чем проблема с тем, что у вас есть прямо сейчас? Для вызова функции, который вы показали, вторая перегрузка должна быть вызвана (рекурсивно) 4 раза, а затем первая перегрузка один раз. – Praetorian

+2

Он компилируется и работает безупречно –

+0

Возможно, вам нужно включить поддержку C++ 11. Какой компилятор вы используете? –

ответ

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); 
} 
+0

Редактировать: это не так, потому что статично, конечно .... Но все же, кажется, что это хорошо работает для Paolo M – Creris

+0

@Creris Я не знаю, что использует компилятор OP и какая именно проблема у него есть, выше, как правило, проще для компиляторов для обработки, возможно, это помогает. Я не утверждаю, что это необходимо. :) –

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 с мы находимся введения.

+0

сейчас это похоже на настоящий хак, но довольно хороший – Creris

+0

Только вчера я [избегал рекурсии] (http://stackoverflow.com/a/29901074/2073257), просто сегодня провалился. # -P Имейте преимущество, чтобы избежать этого! –

+0

@ DanielFrey сказать это снова: никогда не рекурсивно, скажите это снова: никогда не рекурсивно, – Yakk

Смежные вопросы