В приведенном ниже коде у меня есть класс SizedFoo
который построен для определенного размера. Класс GeneralFoo
содержит массив SizedFoos
различных размеров, а затем функцию Bar
будет найти SizedFoo
, который инициализируется для самого маленького размера больше, чем переданные в параметре. Я знаю, что boost mpl имеет функцию lower_bound, но может использоваться только со статически известным значением, есть ли способ использовать эквивалент во время выполнения?
class SizedFoo {
...
public:
SizedFoo(size_t size);
void Bar();
}
template<size_t... sizes_in>
class GeneralFoo {
typedef vector_c<size_t, sizes_in...>::type raw_sizes;
typedef sort<raw_sizes>::type sorted_raw_sizes;
typedef unique<sorted_raw_vector, equal_to<_1, _2> >::type sizes;
std::array<SizedFoos*, size<sizes>::type> foos_;
public:
GeneralFoo() {
...
}
void Bar(size_t size) {
//DOESN'T WORK: size is a runtime value
//auto index = lower_bound<sizes, size>::type;
auto index = ... //What goes here?
foos_[index]->Bar();
}
}
mpl - время компиляции - то, что вы пытаетесь достичь, может быть выполнено только во время выполнения, для этого вам нужно будет использовать std::lower_bound()
.