вернуть измененное значение из ошибки шаблона функции - PullRequest
4 голосов
/ 26 сентября 2010

Мой код примерно такой:

   // ... code

   template <int i>
   int modifyparameter()
   {
     i = i++;
     return i;
   }

   // ... some more code

   int main()
   {
        int answer = modifyparameter<5>();
        cout << answer; //expecting 6
   }

Но я получаю ошибки. Что я сделал не так?

Ответы [ 4 ]

4 голосов
/ 26 сентября 2010

i - это имя типа int , и вы не можете изменять значения. Вы, вероятно, хотите один из них:

template <typename Number>
Number functional(Number x)
{
    return x + 1;
}

template <typename Number>
Number& side_effect(Number& x)
{
    return ++x;
}
3 голосов
/ 26 сентября 2010

Попробуйте:

template <int i>
int modifyparameter()
{
  int copy_of_i = i;
  copy_of_i++;
  return copy_of_i;
}

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

template <int i>
int modifyparameter()
{
  static int copy_of_i = i;
  copy_of_i++;
  return copy_of_i;
}
3 голосов
/ 26 сентября 2010

i не является lvalue, поэтому i++ недопустимо.

14.1/5 говорит.

Нетипичный не ссылочный шаблон-параметр не является lvalue.Его нельзя назначать или каким-либо другим образом изменять его значение.

Оператору постинкремента (++) требуется lvalue в качестве операнда.

1 голос
/ 26 сентября 2010

Хотя об этом не просят, похоже, это требует решения во время компиляции:

template< int I >
struct increment { static const int result = I+1; };

std::cout << increment<41>::result << '\n';

Это struct - это то, что называется мета-функцией. Да, это структура, но она используется (во время компиляции) как функция: вы вызываете ее, передаете параметр и получаете результат. Синтаксис смешной, но это потому, что на самом деле никто не планировал этого делать; возможность была обнаружена (более или менее) случайно.

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

int my_array[increment<7>::result]; // array of 7+1 ints

Конечно, определение такого массива - это нонсенс. Как и в алгоритмах времени выполнения, инкремент обычно является лишь одной операцией алгоритма, который вычисляет нечто более сложное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...