Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
#1

Перехват значений параметров шаблона - C++

01.08.2013, 22:18. Просмотров 360. Ответов 3
Метки нет (Все метки)

Вопрос, собственно, в развитие этой темы - Инициализация std::tuple переменным числом аргументов
Есть вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
namespace spec
{
    template <int... Idx>
    struct index { };
 
    template <int N, int... Idx>
    struct sequence : sequence<N - 1, N - 1, Idx...> { };
 
    template <int... Idx>
    struct sequence<1, Idx...> : index<Idx...> { };
}
template<int N> 
struct A
{
    A() : _N(N) {}
    template<int PrevN> void print_prevN(){std::cout<<PrevN<<std::endl;}
    int _N;
};
 
template<int N> 
struct B
{
    B(): _N(N){}
    template<int PrevN> void print_prevN(){std::cout<<PrevN<<std::endl;}
    int _N;
};
template<typename...Arg>
class HeterogenousContainer
{
public:
 
    void process(){process(spec::sequence<sizeof...(Arg)>());}
 
private:
    std::tuple<Arg...> elements;   
    template <int... Idx> void process(spec::index<Idx...>)//this function generates an error
    {auto aux = { (std::get<Idx>(elements).template print_prevN<std::get<Idx-1>(elements)._N>(), 0) ... };}
};
int main()
{  
   HeterogenousContainer<A<3>, B<4>, B<2>> obj;
   obj.process();
}
Здесь я хочу сделать так, чтобы каждый элемент последовательности, хранящейся в кортеже, мог обрабатывать шаблонный параметр предыдущего элемента через свою шаблонную функцию print_prevN. Я попытался сохранить параметр шаблона в переменну-член _N, но такая штука не комплируется - выражение
C++
1
std::get<Idx-1>(elements)._N>()
не является константным.
Подскажите, как можно выкрутиться?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2013, 22:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перехват значений параметров шаблона (C++):

Переменное число параметров шаблона - C++
Здоровеньки булы. Не уверен, что название темы точно отражает суть вопроса. Есть заготовка шаблонного делегата, параметры которого -...

Выбор кода для компиляции на основании сравнения параметров шаблона - C++
Здравствуйте. Помогите, пожалуйста, разобраться со следующим вопросом. Необходимо выбирать компилируемый код в зависимости от какого-либо...

Определение области допустимых значений параметров формул - C++
Составьте программу, которая подсчитывает и выводит значение t1 и t2 по формулам, которые приведены в Вашем варианте индивидуального...

Использование значений, заданных по умолчанию для параметров функций - C++
Прочтено в учебнике &quot;Джесс Либерти. Си++ за 21 день&quot;. Мол, затерев значения переменной в главной функции, будут использоваться значения в...

Argc argv, передать несколько значений в качестве параметров - C++
void Math() { double a=2, b=3, c=9, x,y, x1,k; cout&lt;&lt;&quot;Vvedite x:&quot;;cin&gt;&gt;x; cout&lt;&lt;&quot;Vvedite x1:&quot;;cin&gt;&gt;x1; cout&lt;&lt;&quot;Vvedite...

Составить программу для определения значений параметров линейного массива - C++
Составить программу для определения значений параметров линейного массива. Всем нечетным элементам присвоить значение 3

3
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
01.08.2013, 22:22 #2
Цитата Сообщение от Gorillych Посмотреть сообщение
выражение
std::get<Idx-1>(elements)._N>()
не является константным.
Сделать _N static constexpr ?
Хотя нет, не поможет конечно...
0
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
02.08.2013, 18:13  [ТС] #3
gray_fox, а как это поможет?

Добавлено через 19 часов 44 минуты
Пытаюсь решить вопрос сабжа с помощью std::integral_constant следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
template<int N> 
struct A : std::integral_constant<int, N>
{
    template<int PrevN> void print_prevN(){std::cout<<PrevN<<std::endl;}
};
 
 
template<int N> 
struct B : std::integral_constant<int, N>
{
    template<int PrevN> void print_prevN(){std::cout<<PrevN<<std::endl;}
};
 
template<typename...Arg>
class HeterogenousContainer
{
public:
       
    void process(){process(spec::sequence<sizeof...(Arg)>());}
    
private:
    std::tuple<Arg...> elements;   
    template <int... Idx> void process(spec::index<Idx...>)
    {auto aux = { (std::get<Idx>(elements).template print_prevN<std::get<Idx-1>(elements)::value>(), 0) ... };}
};
Однако, компилятор gcc 4.7. ругается на синтаксис:
C++
1
2
3
fl.hpp:172:53: ошибка: parse error in template argument list
fl.hpp:172:53: ошибка: ожидался идентификатор
fl.hpp:172:53: ошибка: ожидалось «)»
Ему не нравится строчка
C++
1
{auto aux = { (std::get<Idx>(elements).template print_prevN<std::get<Idx-1>(elements)::value>(), 0) ... };}
а точнее, вот эта ее часть:
C++
1
std::get<Idx-1>(elements)::value
Подскажите, что тут исправить, чтобы компилятор на синтаксис не злился и еще хотел бы узнать мнения о правильности самого подхода.
Заранее благодарю.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
02.08.2013, 18:46 #4
C++
1
std::get<Idx-1>(elements)::value
get так-то объект возвращает, а не тип. Если хотим тип юзаем std::tuple_element.

Добавлено через 3 минуты
C++
1
2
3
4
5
{auto aux = { (std::get<Idx>(elements).
template print_prevN
<
  std::tuple_element<Idx-1, std::tuple<Arg...>>::type::value
>(), 0) ... };}
1
02.08.2013, 18:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 18:46
Привет! Вот еще темы с ответами:

Составить программу вычисления и печати таблицы значений функции при заданных значениях параметров - C++
Составить программу вычисления и печати таблицы значений функции при заданных значениях параметров. Помогите пожалуйста. Заранее спасибо!

Составить программу вычисления и печати таблицы значений функции при заданных значениях параметров - C++
Составить программу вычисления и печати таблицы значений функции при заданных значениях параметров.

Определение метода-шаблона за пределами шаблона класса - C++
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template &lt;typename T1&gt; class K // шаблон класса { public:...

Написать программу, которая вычисляет значение выражения, и определить ее значение для введенных пользователем значений фактических параметров. - C++
Написать программу, которая вычисляет значение выражения, и определить ее значение для введенных пользователем значений фактических...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru