Переменная C ++ в константное выражение - PullRequest
2 голосов
/ 01 января 2011
template <typename Real>
class A{ };

template <typename Real>
class B{ };
//... a few dozen more similar template classes

class Computer{

public slots:
 void setFrom(int from){ from_ = from; }
 void setTo(int to){ to_ = to; }

private:
 template <int F, int T> void compute(){

  using boost::fusion::vector;
  using boost::fusion::at_c;

  vector<A<float>, B<float>, ...> v;
  at_c<F>(v).operator()(at_c<T>(v));  //error; needs to be const-expression.
};

//...
computer.compute(1, 3);  // ok
computer.compute(var1, var2);  // var1, var2 cannot appear in a constant-expression

Этот вопрос не о Qt, но в моем примере есть строка кода Qt.

setFrom () и setTo () - это функции, которые вызываются на основе выбора пользователя через виджет GUI. Корень моей проблемы в том, что 'from' и 'to' являются переменными. В моей функции-члене compute мне нужно выбрать тип (A, B и т. Д.), Основанный на значениях from и to. Единственный способ, которым я знаю, как сделать то, что мне нужно, - это использовать операторы switch, но в моем случае это очень утомительно, и я бы хотел этого избежать. Есть ли способ преобразовать строку ошибки в выражение-константу?

Ответы [ 2 ]

1 голос
/ 01 января 2011

Если вы не хотите использовать операторы блока switch или if/else, то вы не сможете выполнить эту задачу.Потому что at_c<> шаблон функции принимает интегральный параметр, который нужно знать во время компиляции.И ваши переменные to_ и from_ не известны во время компиляции.

И мой ответ в следующей теме как-то связан с этой темой:

C ++ STL type_traits question


Или возможно (хотя я не уверен), вы можете написать шаблон класса, который наследуется от себя, каждая база уменьшает значение интеграла N, а затем классtemplate отправляет функцию для определенного значения N.

1 голос
/ 01 января 2011

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

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