2015-12-18 3 views
1

У меня есть шаблонный класс с целыми числами в качестве аргументов. Один статический const integer (назовем его Length) этого класса должен быть рассчитан на основе аргументов. Для вычисления нужен цикл (насколько я знаю), поэтому простое выражение не поможет.Инициализировать static const int со статической функцией

static int setLength() 
{ 
    int length = 1; 
    while (length <= someTemplateArgument) 
    { 
     length = length << 1; 
    } 
    return length; 
} 

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

Есть ли решение этой проблемы? Я знаю, что constexp может помочь, но я не могу использовать C11 или более позднюю версию.

+1

Конечно, вы можете сделать некоторые шаблонный метапрограммирования, чтобы получить постоянное право. Я лично не вникаю в детали этого, потому что я думаю, что шаблон-метапрограммирование - это жестокость, которую лучше избегать, но это, безусловно, возможно. – cmaster

ответ

2

Использование метапрограммирования. Реализация 11 enable_if C++ взяты из cppreference.com

#include <iostream> 

template<bool B, class T = void> 
struct enable_if {}; 

template<class T> 
struct enable_if<true, T> { typedef T type; }; 

template <int length, int arg, typename = void> 
struct length_impl 
{ 
    static const int value = length_impl<(length << 1), arg>::value; 
}; 

template <int length, int arg> 
struct length_impl<length, arg, typename enable_if<(length > arg)>::type> 
{ 
    static const int value = length ; 
}; 

template <int arg> 
struct length_holder 
{ 
    static const int value = length_impl<1, arg>::value; 
}; 

template<int n> 
struct constexpr_checker 
{ 
    static const int value = n; 
}; 

int main() 
{ 
    std::cout << constexpr_checker< length_holder<20>::value >::value; 
} 
+0

Эй, это похоже на правильный подход. Благодаря! –

+0

Кажется, это правильное решение, поэтому +1 для этого. Тем не менее, это только доказывает то, что я сказал в комментариях выше: Template metaprogramming * is * зверство ... – cmaster

Смежные вопросы