LINUX.ORG.RU

c++ , constexpr


0

0

enum Type{Type1,Type2};

template<enum Type>
struct Foo
{
};

const Type gettype()
{
return Type1;
}

const Type t = gettype();
Foo<t> foo; // конечно не прокатывает

В новом стандарте обещают "constexpr" , а как сейчас побороть компилятор ?

★★★

Вроде, никак. Только макросами.

const86 ★★★★★
()

>как сейчас побороть компилятор ?

в качестве константы времени компиляции можно использовать результат выполнения sizeof. делаешь специализации шаблонов функций для данных значений (enum это int, т.е. проблем быть не должно) с различным размером возвращаемого значения. если непонятно, могу написать и код

jtootf ★★★★★
()

enum Type{Type1,Type2};

template<enum Type>
struct Foo
{
};


struct gettype
{
  const static Type value = Type1;
};

const Type t = gettype::value;

Foo<t> foo;

Begemoth ★★★★★
()
Ответ на: комментарий от kitov

>в общих чертах пожалуйста :-)

подумал и понял, что не помню как я это делал. вот, в любом случае, моя дискуссия на c.l.c++ в процессе решения подобной задачи:

http://groups.google.com/group/comp.lang.c++/browse_thread/thread/13826307733...

а код до завтра постараюсь всё же наваять

jtootf ★★★★★
()
Ответ на: комментарий от kitov

Это к тому, что шаблон - это функция времени компиляции, а нешаблонный тип - нульарная функция. Наверно, я неправильно понял.

Begemoth ★★★★★
()
Ответ на: комментарий от kitov

>Видимо без макросов не разобраться ...

да. я таки использовал boost.typeof, а для компиляторов без встроенного typeof он реализован именно через макросы. другого варианта получить тип возвращаемого значения для шаблона функции, специализации которой по этому значению отличаются, я не нашёл

jtootf ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.