[c++] как сделать constexpr из символа строки?
constexpr char SomeTemplateMagic(const char * s, int n) { return s[n];}
но вообще 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
такое ощущение, что похожий код делал на выходных, но не получилось.
но я там пытался не строку, а вообще массив шаблонных элементов передать.
но вообще enum же как инт выводится, так что не очень понятно чего ты на самом деле хочешь?
ну да, но это не проблема уже, просто не стал вдаваться.
std::cout << T<s[3]>::character << T<s[0]>::character << std::endl;
работает, так что давай задачу целиком
а задача в общем (да-да, я тоже вспомнил про X, Y и Z) - хочу расшаблонивать классы строковыми литералами, а так, как это невозможно пытаюсь придумать обходной костыль через компайл-тайм итерацию по строке и складывание расшаблоненного в список типов или что-то типа того.
хочу расшаблонивать классы строковыми литераламиэто вроде тоже больше похоже на "как", а не на "что" и "зачем"
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
хочу инстанцировать шаблон символом из литеральной строки, что-то типадолжно напечатать "Hello"