2015-07-04 2 views
0

Я пытаюсь сделать что-то вроде этого:VARIADIC значение шаблона в качестве аргумента шаблона для структуры

template <int v1, template <typename... Args> Args... vx> struct Sum { 
    const static int RESULT = v1 + Sum<vx...>::RESULT; 
}; 

template <int v> struct Sum { 
    const static int RESULT = v; 
} 

Чтобы использовать так:

int a = Sum<1, 2>::RESULT; 
int b = Sum<1, 2, 3, 4, 5>::RESULT; 

Очевидно, что-то здесь не так, и я борюсь с концепция вариационного шаблона как значения в определении структуры/класса. Можно ли сделать что-то подобное? Как?

Спасибо ...

ответ

0

Одна из проблем состоит в том, что ни декларация шаблона специализируется другой и Кода в этой декларации отличается, так что код плохо сформирован.

Также вы на самом деле не используя шаблон в качестве параметра шаблона здесь, и это не требуется для кода, как вы можете увидеть здесь:

// main template 
template <int v1, int... vx> struct Sum { 
    const static int RESULT = v1 + Sum<vx...>::RESULT; 
}; 

// specialization to make recursion terminate 
// the list of matched template parameters is listed 
// after the name of the struct in angle brackets 
template <int v> struct Sum<v> { 
    const static int RESULT = v; 
}; 

static_assert(Sum<1, 2, 3, 4, 5>::RESULT == 15, ""); 

int main() {} 
+0

milleniumbug, большое спасибо! Я пробовал что-то вроде этого, но это не сработало (я думаю, что я забыл в специализированной версии Sum). Это именно то, что я искал. Еще раз спасибо! – Aesope

+1

@jcdemers Добро пожаловать. Чтобы выразить благодарность, вы можете [принять] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) ответ на свой вопрос, если это помогло вам решить проблему проблема. – milleniumbug