LINUX.ORG.RU

Как правильно сделать шаблон от n-аргументов?

 ,


0

6

Есть шаблон метода

template<typename... Ts>
size_t get_index (const Ts&... args){
	size_t index = 0, n = 0;
	for(const auto& arg : {args...}){
		index += arg*helper[n];
		n++;
	}
	return index;
}
, Когда пытаюсь его вызвать
for(size_t x=0; x<x_tiles; x++){
	for(size_t y=0; y<y_tiles; y++){
		obj.get_index(x,y,0); // а size_t(0) -- работает
	}
}
получаю
unable to deduce ‘std::initializer_list<auto>&&’ from ‘{args#0, args#1, args#2}’
   for(const auto& arg : {args...}){
Как сделать правильно?

★★★★★

Хм, УМВР

$ cat t.cpp
#include <iostream>

template <typename... Ts>
size_t get_sum(const Ts&... args)
{
    size_t s = 0;
    for (const auto& a : {args...})
        s += a;

    return s;
}

int main()
{
    std::cout << get_sum(1, 2, 3) << std::endl;
    return 0;
}
$ g++ t.cpp -Wall -std=c++14
$ ./a.out
6

Или я тебя неправильно понял?

Deleted
()

У тебя std::initializer_list не может сконструироваться из разнотипных объектов( константа 0 скорее всего int, a все остальное size_t), или делай приведение к size_t или рекурсивный обход:

template<typename H>
int bar(int index, int  n, const H& arg) {
    return index + arg * n;
}
template <typename H, typename ... T>
int bar(int index, int n, const H & h, const T&... args) {
    index += h*n;
    return bar(index, n+1, args...);
}
template <typename ... T>
int foo(const T&... args) {
    int index = 0, n = 0;
    return bar(index,n,args...);
}
int main() {
    size_t a1 = 1, a2= 2;
    int b = foo(a1,a2,0);
    std::cout << b << std::endl;
    return 0;
}
Vinick ★★
()

Жди fold в С++17 или делай reduce через темплейты.

mashina ★★★★★
()
Последнее исправление: mashina (всего исправлений: 1)

В случае, если там будут только такие индексы, можно написать так:

for(const auto& arg : {static_cast<std::size_t>(args)...})

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Спасибо, вот это как раз то что нужно было. Не знал, что можно кастовать неопределённое число аргументов.

thunar ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.