[c++] как сделать constexpr из символа строки?

elenangel

хочу инстанцировать шаблон символом из литеральной строки, что-то типа

#include <iostream>

temlate <char C>
struct T
{
enum {character = C};
};

int main(int, char**)
{
constexpr char * s = "Hello, world!";

std::cout << T<SomeTemplateMagic(s, 0)>::character <<
T<SomeTemplateMagic(s, 1)>::character <<
T<SomeTemplateMagic(s, 2)>::character <<
T<SomeTemplateMagic(s, 3)>::character <<
T<SomeTemplateMagic(s, 4)>::character << std::endl;
return 0;
}

должно напечатать "Hello"

zya369

 constexpr char SomeTemplateMagic(const char * s, int n) { return s[n];} 

:confused:
но вообще enum же как инт выводится, так что не очень понятно чего ты на самом деле хочешь?

e:~/tmp$ cat 11.cpp
#include <iostream>

template <char C>
struct T
{
enum {character = C};
};

template <char C>
struct T1
{
static const char character = C;
};
constexpr char SomeTemplateMagic(const char * s, int n) { return s[n];}

int main {
constexpr const char * s = "Hello, world!";
std::cout << T<SomeTemplateMagic(s, 3)>::character << T<SomeTemplateMagic(s, 0)>::character <<
std::endl;
std::cout << T1<SomeTemplateMagic(s, 3)>::character << T1<SomeTemplateMagic(s, 0)>::character <<
std::endl;

return 0;
}

e:~/tmp$ g++ -std=c++0x 11.cpp && ./a.out
10872
lH

elenangel

спасибо, вроде работает.
такое ощущение, что похожий код делал на выходных, но не получилось.
но я там пытался не строку, а вообще массив шаблонных элементов передать.
но вообще enum же как инт выводится, так что не очень понятно чего ты на самом деле хочешь?

ну да, но это не проблема уже, просто не стал вдаваться.

zya369

у меня, собственно, и

std::cout << T<s[3]>::character << T<s[0]>::character << std::endl;

работает, так что давай задачу целиком

elenangel

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

zya369

хочу расшаблонивать классы строковыми литералами
это вроде тоже больше похоже на "как", а не на "что" и "зачем" :)

apl13

Как-то так?
struct NamedClass {
virtual std::string name const = 0;
};

template<char const *nm> struct NBase: public NamedClass {
std::string name const { return nm; }
};

#define NAMED_CLASS(nm) nm: public NBase<#nm>

struct NAMED_CLASS(Omg) { Omg { std::cout << "It's really an " << name << "!" << std::endl; }};

elenangel

Зачем - хочу попробовать парсер на темплейтах сделать. Про буст знаю, там не совсем то, что хочется видеть. В общем, развлекаюсь.
Оставить комментарий
Имя или ник:
Комментарий: