Шаблон C ++ для генерации частей оператора switch? - PullRequest
4 голосов
/ 28 января 2010

Можно ли написать шаблон

Foo<int n>

такой, что:

Foo<2>

дает

switch(x) {
  case 1: return 1; break;
  case 2: return 4; break;
}

, а

Foo<3>

дает

switch(x) {
  case 1: return 1; break;
  case 2: return 4; break;
  case 3: return 9; break;
}

Спасибо!

EDIT:

изменил код выше, чтобы вернуть квадрат, как многие уже догадались (и я плохо спросил)

Ответы [ 5 ]

5 голосов
/ 28 января 2010

Да, сделайте шаблон с увеличенным мастером switch и надеюсь / помогите оптимизатору превратить его в маленький switch. См. Мой ответ на другой ваш вопрос Переключатель типов во время выполнения для списков типов в качестве переключателя вместо вложенного if? . Кроме того, не дублируйте пост.

2 голосов
/ 28 января 2010

Сортировка, а не совсем. Вы можете получить что-то близкое к запрашиваемому вами поведению, но не сделаете это с реальным переключателем.

Хорошо, я предполагаю, что foo<N> означает способность вычислять квадрат любого значения от 1 до N, но никаких других значений. Итак, я придумал это:

template <int t>
int foo(int x)
{
    return (x > t)   ? -1 :
           (x == t)  ? (x * x) :
                       foo<t -1>(x);
}    

template <>
int foo<0>(int x)
{
    return -1;
}
2 голосов
/ 28 января 2010

Вы не сможете использовать шаблонное метапрограммирование для оценки результата switch, если значение, которое вы включаете (в данном случае, x), не известно при компиляции время. Это потому, что шаблоны раздуваются во время компиляции, а не во время выполнения.

Однако, если вы знаете значение во время компиляции, вы можете добиться аналогичного эффекта:

#include <cstdlib>
#include <iostream>
using namespace std;

template<int V> struct intswitch
{
    operator int() const
    {
        return V * V;
    }
};

int main() {

    cout << "1 = " << intswitch<1>() << endl
        << "2 = " << intswitch<2>() << endl
        << "3 = " << intswitch<3>() << endl
        << "4 = " << intswitch<4>() << endl
        << "5 = " << intswitch<5>() << endl
        << "6 = " << intswitch<6>() << endl
        << "7 = " << intswitch<7>() << endl
        << "8 = " << intswitch<8>() << endl
        << "9 = " << intswitch<9>() << endl
        << "10 = " << intswitch<10>() << endl
        ;
}

Вывод программы:

1 = 1
2 = 4
3 = 9
4 = 16
5 = 25
6 = 36
7 = 49
8 = 64
9 = 81
10 = 100
0 голосов
/ 28 января 2010

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

0 голосов
/ 28 января 2010

Нет, вам понадобится справочная таблица для чего-то подобного.

...