Templates: вывод значения аргумента функции
От: Аноним  
Дата: 31.10.12 09:41
Оценка:
Надо как то так (с выводом):


template<int N>
void func(int N)
{
    char arr[N];
    ...
}

int main()
{
   func(15);
   ...
}


знаю что можно вот так:

template<int N>
void func()
{
    char arr[N];
    ...
}


int main()
{
func<15>(); // вот как бы 15 впихнуть в круглые скобки.
...
}

но хотелось бы именно с выводом значения аргумента.
Или неполучится?
Re: Templates: вывод значения аргумента функции
От: watch-maker  
Дата: 31.10.12 10:07
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Или неполучится?

В общем случае, конечно, не получится. Ведь аргумент функции может быть, например, переменной. И что, компилятор должен создать 2³² вариантов функций для каждого возможного значения аргумента?
Если тебе известно, что диапазон N ограничен, то можешь сделать адаптер вида
switch(N) {
  case 0: return func<0>();
  case 1: return func<1>();
  case 2: return func<2>();
  case 3: return func<3>();
  ...
}
В простых случаях можно даже поручить создание такого кода препроцессору или шаблонам
Автор: pasenger
Дата: 14.10.07
.

А вообще, зачем тебе это нужно? Если только создать массив переменного размера, то используй std::vector<char>. Или вызывай платформо-зависимые функции типа alloca, если тебе нужно создать массив именно на стеке и ты уверен, что N символов в него поместятся.
Re[2]: Templates: вывод значения аргумента функции
От: letopisez  
Дата: 31.10.12 10:42
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>В общем случае, конечно, не получится. Ведь аргумент функции может быть, например, переменной. И что, компилятор должен создать 2³² вариантов функций для каждого возможного значения аргумента?


Зачем 2³²? Какие варианты вызываем, такие и создал. Что в этом такого? Ну вот чем вариант

template<int N>
void func(char (&p) [N])
{
}

Лучше в этом отношенни? Так же N может быть любым и так же можно сказать, что надо создавать 2³² функций.

Идея скрыть синтаксис шаблонов. Вообще я конечно и без этого обойдусь, интересует именно теоретическая возможность.
Есть еще предложения?
Re[3]: Templates: вывод значения аргумента функции
От: watch-maker  
Дата: 31.10.12 11:11
Оценка:
Здравствуйте, letopisez, Вы писали:

L>Здравствуйте, watch-maker, Вы писали:


WM>>В общем случае, конечно, не получится. Ведь аргумент функции может быть, например, переменной. И что, компилятор должен создать 2³² вариантов функций для каждого возможного значения аргумента?


L>Зачем 2³²? Какие варианты вызываем, такие и создал.

В том-то и дело, что если и функции есть аргумент, то в него можно передать переменную, значение которой может быть вообще не известно на этапе компиляции.

L>Идея скрыть синтаксис шаблонов. Вообще я конечно и без этого обойдусь, интересует именно теоретическая возможность.

L>Есть еще предложения?
Ну напиши макрос:
#define func(n) func_impl<n>()
Re[3]: Templates: вывод значения аргумента функции
От: rg45 СССР  
Дата: 31.10.12 11:37
Оценка:
Здравствуйте, letopisez, Вы писали:

L>...Ну вот чем вариант


L>template<int N>

L>void func(char (&p) [N])
L>{
L>}

L>Лучше в этом отношенни?


Тем, что N является частью сигнатуры типа, и это гарантированно константа, в отличие от фактического аргумента функции.
--
Справедливость выше закона. А человечность выше справедливости.
Re: Расскажи про задачу побольше...
От: Erop Россия  
Дата: 31.10.12 13:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Надо как то так (с выводом):



А>знаю что можно вот так:


А>но хотелось бы именно с выводом значения аргумента.

А>Или неполучится?

Такое чувство, что ты чего-то важного недосказал.
Расскажи что конкретно ты хочешь сделать?

А то как-то немного не ясно, если ты хочешь таки сделать какую-то именно вот rt-функцитю, не ясно зачем ей вообще быть шаблоном и не получать N просто как обычный аргумент.
А если речь идёт о константах времени компиляции, то не понятно зачем там появилась функция, а не конструкция вида
template<int N> struct foo_impl { enum { Value = N * N - N / 2 }; };
#define foo( N ) foo_impl<(N)>::Value

Ещё интересно какая версия С++ тебя интересует, а то, в c++11 появились constexpr...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Templates: вывод значения аргумента функции
От: Evgeny.Panasyuk Россия  
Дата: 31.10.12 14:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>int main()

А>{
А> func<15>(); // вот как бы 15 впихнуть в круглые скобки.
А> ...
А>}
А>но хотелось бы именно с выводом значения аргумента.

Можно вообще без вывода но это gcc'шныйVLA

Если хочется число в круглые скобки, то можно так .

Если нужено именно что-то типа VLA, то в простом приближении будет.
Re[2]: тогда уж лучше так
От: Erop Россия  
Дата: 01.11.12 11:21
Оценка: +1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Если нужено именно что-то типа VLA, то в простом приближении будет.


Тогда уж лучше так
Автор: Erop
Дата: 27.02.07
...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: тогда уж лучше так
От: Evgeny.Panasyuk Россия  
Дата: 01.11.12 11:53
Оценка: +1
Здравствуйте, Erop, Вы писали:

EP>>Если нужено именно что-то типа VLA, то в простом приближении будет.

E>Тогда уж лучше так
Автор: Erop
Дата: 27.02.07
...


Согласен, что лучше (если бы сам использовал, то тоже бы в класс обвернул. выше это просто демо идеи).
И согласен про alloca, его лучше не использовать — по лбу может ударить.
Да и вообще сами VLA — скользкая дорожка.
Re[2]: Templates: вывод значения аргумента функции
От: letopisez  
Дата: 01.11.12 13:21
Оценка:
Всем спасибо.

Предыдущий пример с массивом был фиктивным, показывающий суть задачи. Но сама задача совсем другая.
Вообще идея была проверять допустимость использования первого аргумента функции со вторым.

Понимаю что сумбурно, но вот пример, надеюсь что прояснит немного ситуацию.

class PropertyContainer
{
void SetProperty(int query_id, Variant v);

template <int query_id, class T>
void SetProperty(T &prop)
{
SetProperty(Validator<query_id,T>::id, prop); // генерация ошибки времени компиляции если не специализирован Validator<query_id,T>
}
}

CREATE_PROPERTY(QID_TIMER, int);

//использование
pInst->SetProperty<QID_TIMER>(123);

Вот здесь хотелось привести к обычному виду, просто потому, что QID_TIMER — по смыслу является аргументом метода.
А при такой записи, это не очевидно. Вот вобщем и все.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.