Здравствуйте, Аноним, Вы писали:
А>Или неполучится?
В общем случае, конечно, не получится. Ведь аргумент функции может быть, например, переменной. И что, компилятор должен создать 2³² вариантов функций для каждого возможного значения аргумента?
Если тебе известно, что диапазон N ограничен, то можешь сделать адаптер вида
switch(N) {
case 0: return func<0>();
case 1: return func<1>();
case 2: return func<2>();
case 3: return func<3>();
...
}
А вообще, зачем тебе это нужно? Если только создать массив переменного размера, то используй std::vector<char>. Или вызывай платформо-зависимые функции типа alloca, если тебе нужно создать массив именно на стеке и ты уверен, что N символов в него поместятся.
Re[2]: Templates: вывод значения аргумента функции
Здравствуйте, watch-maker, Вы писали:
WM>В общем случае, конечно, не получится. Ведь аргумент функции может быть, например, переменной. И что, компилятор должен создать 2³² вариантов функций для каждого возможного значения аргумента?
Зачем 2³²? Какие варианты вызываем, такие и создал. Что в этом такого? Ну вот чем вариант
template<int N>
void func(char (&p) [N])
{
}
Лучше в этом отношенни? Так же N может быть любым и так же можно сказать, что надо создавать 2³² функций.
Идея скрыть синтаксис шаблонов. Вообще я конечно и без этого обойдусь, интересует именно теоретическая возможность.
Есть еще предложения?
Re[3]: Templates: вывод значения аргумента функции
Здравствуйте, letopisez, Вы писали:
L>Здравствуйте, watch-maker, Вы писали:
WM>>В общем случае, конечно, не получится. Ведь аргумент функции может быть, например, переменной. И что, компилятор должен создать 2³² вариантов функций для каждого возможного значения аргумента?
L>Зачем 2³²? Какие варианты вызываем, такие и создал.
В том-то и дело, что если и функции есть аргумент, то в него можно передать переменную, значение которой может быть вообще не известно на этапе компиляции.
L>Идея скрыть синтаксис шаблонов. Вообще я конечно и без этого обойдусь, интересует именно теоретическая возможность. L>Есть еще предложения?
Ну напиши макрос:
#define func(n) func_impl<n>()
Re[3]: Templates: вывод значения аргумента функции
Здравствуйте, Аноним, Вы писали:
А>Надо как то так (с выводом):
А>знаю что можно вот так:
А>но хотелось бы именно с выводом значения аргумента. А>Или неполучится?
Такое чувство, что ты чего-то важного недосказал.
Расскажи что конкретно ты хочешь сделать?
А то как-то немного не ясно, если ты хочешь таки сделать какую-то именно вот rt-функцитю, не ясно зачем ей вообще быть шаблоном и не получать N просто как обычный аргумент.
А если речь идёт о константах времени компиляции, то не понятно зачем там появилась функция, а не конструкция вида
template<int N> struct foo_impl { enum { Value = N * N - N / 2 }; };
#define foo( N ) foo_impl<(N)>::Value
Ещё интересно какая версия С++ тебя интересует, а то, в c++11 появились constexpr...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Аноним, Вы писали:
А>int main() А>{ А> func<15>(); // вот как бы 15 впихнуть в круглые скобки. А> ... А>} А>но хотелось бы именно с выводом значения аргумента.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Согласен, что лучше (если бы сам использовал, то тоже бы в класс обвернул. выше это просто демо идеи).
И согласен про alloca, его лучше не использовать — по лбу может ударить.
Да и вообще сами VLA — скользкая дорожка.
Re[2]: Templates: вывод значения аргумента функции
Предыдущий пример с массивом был фиктивным, показывающий суть задачи. Но сама задача совсем другая.
Вообще идея была проверять допустимость использования первого аргумента функции со вторым.
Понимаю что сумбурно, но вот пример, надеюсь что прояснит немного ситуацию.
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>
}
}
Вот здесь хотелось привести к обычному виду, просто потому, что QID_TIMER — по смыслу является аргументом метода.
А при такой записи, это не очевидно. Вот вобщем и все.