C++ variable to const expression

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

This question isn't about Qt, but there is a line of Qt code in my example.

The setFrom() and setTo() are functions that are called based on user selection via the GUI widget. The root of my problem is that 'from' and 'to' are variables. In my compute member function I need to pick a type (A, B, etc.) based on the values of 'from' and 'to'. The only way I know how to do what I need to do is to use switch statements, but that's extremely tedious in my case and I would like to avoid. Is there anyway to convert the error line to a constant-expression?

-------------Problems Reply------------

If you don't want to use switch or if/else block statements then there is no way you can accomplish this task. Because at_c<> function template takes integral parameter which needs to be known at compile time. And your variables to_ and from_ are not known at compile time.

And my answer in the following topic is somehow related to this topic:

C++ STL type_traits question.



Or possibly (I'm not sure though) you can write a class template which derives from itself, each base decreasing the value of integral N and then class template dispatches a function for a particular value of N.

Not sure if it helps but you can put your values in a map and populate it elsewhere then there is no tedious switch statement.

Category:c# Views:1 Time:2011-01-01
Tags: c# boost

Related post

Copyright (C) dskims.com, All Rights Reserved.

processed in 0.184 (s). 11 q(s)