MSVC2015 constexpr и вся эта шаблонная магия
От: Tujh Голландия  
Дата: 03.11.16 07:31
Оценка:
Добрый день.

Есть некая цель, выражающаяся в переводе числа в строку на этапе компиляции
STR(x) #x
не предлагать, нужна обработка с определённой логикой.
Следующий минимальный пример прекрасно отрабатывает на GCC/Clang, но не собирается в MSVC 2015, где вроде бы заявлена поддержка constexpr:
#include <iostream>

#define TAG 10000
/* calculate number of digits */
constexpr size_t num_digits(size_t x) {
    return x < 10 ? 1 : 1 + num_digits(x / 10);
}
/* storage for string data */
template<char... args>
struct metastring {
    const char data[sizeof... (args)] = { args... };
};
/* metastruct for string type */
template< size_t size, size_t x, char... args >
struct num_builder {
    typedef typename num_builder< size - 1, x / 10, '0' + (x % 10), args... >::type type;
};
/* proceed last digit */
template< size_t x, char... args >
struct num_builder< 1, x, args... > {
    typedef metastring< '0' + x, args... > type;
};
/* metaclass fro conversation  */
template<size_t x>
class __builder {
private:
    /* generate string type */
    typedef typename num_builder< num_digits(x), x, '\0' >::type type;
    /* string declaration */
    static constexpr type value{};
public:
    /*  */
    static constexpr const char* get() { // error C2059: syntax error: 'inline function header'
                                         // error C2059: syntax error: ''symbol''
                                         // error C2143: syntax error: missing ';' before '{'
                                         // error C2447: '{': missing function header (old-style formal list?)
        return value.data;
    }
};
/* instantiate string */
template< size_t x >
constexpr typename __builder< x >::type __builder< x >::value;
/* compile-time const for converted string */
static constexpr const char* tag = __builder< TAG >::get(); // error C2131: expression did not evaluate to a constant
                                                            // note: failure was caused by call of undefined function or one not declared 'constexpr'
                                                            // note: see usage of '__builder<10000>::get'
int main()
{
    std::cout << "Hello world!" << std::endl;
    std::cout << "tag = " << tag << std::endl;
    return 0;
}

Может кто подскажет, в чём проблема и как её решить? Или в MSVC всё не очень хорошо с поддержкой подобной "шаблонной магии" (может я что-то не правильно в ней понимаю) и проще отказаться от такого решения вообще?

Заранее благодарю за ответы.
Re: MSVC2015 constexpr и вся эта шаблонная магия
От: VTT http://vtt.to
Дата: 03.11.16 08:22
Оценка: 3 (1)
Если перенести реализацию get() после определения value, то вроде работает:

/* metaclass fro conversation  */
template<size_t x>
class __builder {
private:
    /* generate string type */
    typedef typename num_builder< num_digits(x), x, '\0' >::type type;
    /* string declaration */
    static constexpr type value{};
public:
    /*  */
    static constexpr const char* get();
};
/* instantiate string */
template< size_t x >
constexpr typename __builder< x >::type __builder< x >::value;

template< size_t x >
constexpr const char * __builder< x >::get()
{
    return(value.data);
}

/* compile-time const for converted string */
static constexpr const char* tag = __builder< TAG >::get();
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[2]: MSVC2015 constexpr и вся эта шаблонная магия
От: Tujh Голландия  
Дата: 03.11.16 08:51
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>Если перенести реализацию get() после определения value, то вроде работает:

У, шайтан.

Благодарю, заработало и в проекте!
Re: MSVC2015 constexpr и вся эта шаблонная магия
От: Vain Россия google.ru
Дата: 08.11.16 01:23
Оценка: +2 -1 :)
Здравствуйте, Tujh, Вы писали:

T>Есть некая цель, выражающаяся в переводе числа в строку на этапе компиляции

T>
STR(x) #x

T>не предлагать, нужна обработка с определённой логикой.
какой только люди уродливый код не оправдают от страха использования простых макросов...
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: MSVC2015 constexpr и вся эта шаблонная магия
От: antropolog  
Дата: 08.11.16 14:51
Оценка: +2 -2
Здравствуйте, Vain, Вы писали:

V>какой только люди уродливый код не оправдают от страха использования простых макросов...


да это не страх, а просто отсутствие мало-мальски критического мышления. Сказали макросы-зло. Значит зло. А почему зло — думать не стоит. То что вышеприведённый говнокод на шаблонах ещё большее зло, никто не говорил. Поэтому имеем то что имеем.
Re[3]: MSVC2015 constexpr и вся эта шаблонная магия
От: B0FEE664  
Дата: 15.11.16 16:39
Оценка:
Здравствуйте, antropolog, Вы писали:

V>>какой только люди уродливый код не оправдают от страха использования простых макросов...

A>да это не страх, а просто отсутствие мало-мальски критического мышления. Сказали макросы-зло. Значит зло. А почему зло — думать не стоит. То что вышеприведённый говнокод на шаблонах ещё большее зло, никто не говорил. Поэтому имеем то что имеем.

Чем этот код зло?
PS кроме двойного подчёркивания в названии класса
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.