При использовании шаблонов в С++ мне нужно передать строки в качестве параметров шаблона значения.
Мне было довольно сложно понять, почему некоторые параметры разрешены, а другие нет.
Например, const char * может быть задан как аргумент шаблона, если статический член класса не может, если он определен снаружи.
Я сделал небольшую программу, чтобы проверить все это, комментируя строки, которые не компилируются. Я также сделал пару предположений, основанных на выходе компилятора, но они могут быть неправильными.
Каковы правила значений шаблона шаблона. Я видел, что объекту нужна внешняя связь, но bool разрешен, хотя он явно не имеет никакой связи.
#include <iostream>
using namespace std;
struct tag {
static char array[];
static const char carray[];
static char *ptr;
static const char *cptr;
static const char *const cptrc;
static string str;
static const string cstr;
};
char tag::array[] = "array";
const char tag::carray[] = "carray";
char *tag::ptr = (char*)"ptr"; // cast because deprecated conversion
const char *tag::cptr = "cptr";
const char *const tag::cptrc = "cptrc";
string tag::str = "str";
const string tag::cstr = "cstr";
namespace ntag {
char array[] = "array";
const char carray[] = "carray";
char *ptr = (char *)"ptr"; // cast because deprecated conversion
const char *cptr = "cptr";
const char *const cptrc = "cptrc";
string str = "str";
const string cstr = "cstr";
};
template <class T, T t>
void print() { cout << t << endl; };
int main()
{
cout << "-- class --" << endl;
// Works
print<char *, tag::array>();
print<const char *, tag::carray>();
// Does not work because it is a lvalue ?
// print<char *, tag::ptr>();
// print<const char *, tag::cptr>();
// print<const char *const, tag::cptrc>();
// Template type param must be a basic type ?
// print<string, tag::str>();
// print<const string*, tag::cstr>();
cout << "-- namespace --" << endl;
// Works
print<char *, ntag::array>();
// No external linkage ?
// print<const char *, ntag::carray>();
// Does not work because it is an lvalue ?
// print<char *, ntag::ptr>();
// print<const char *, ntag::cptr>();
// print<const char *const, ntag::cptrc>();
// The type of a template value param must a basic type
// print<string, ntag::str>();
// print<const string*, ntag::cstr>();
}