是否可以将字符串作为模板参数?

时间:2013-07-11 15:39:36

标签: c++ templates

是否可以将字符串作为模板参数以及如何?像

A<"Okay"> is a type.

任何字符串(std :: string或c-string)都可以。

2 个答案:

答案 0 :(得分:2)

是的,但您需要将其放在具有外部链接的变量中 (或C ++ 11是否删除了外部链接的要求)。 基本上,给出:

template <char const* str>
class A { /* ... */ };

这样:

extern char const okay[] = "Okay";

A<okay> ...

的工作原理。注意认为字符串的内容 它定义了唯一性,但对象本身:

extern char const okay1[] = "Okay";
extern char const okay2[] = "Okay";

鉴于此,A<okay1>A<okay2>有不同的类型。

答案 1 :(得分:1)

这是使字符串内容确定唯一性的一种方法

#include <windows.h> //for Sleep()
#include <iostream>
#include <string>

using namespace std;

template<char... str>
struct TemplateString{
    static const int n = sizeof...(str);
    string get() const {
        char cstr[n+1] = {str...}; //doesn't automatically null terminate, hence n+1 instead of just n
        cstr[n] = '\0'; //and our little null terminate
        return string(cstr); 
    }
};

int main(){
    TemplateString<'O','k','a','y'> okay;
    TemplateString<'N','o','t',' ','o','k','a','y'> notokay;
    cout << okay.get() << " vs " << notokay.get() << endl;
    cout << "Same class: " << (typeid(okay)==typeid(notokay)) << endl;
    Sleep(3000); //Windows & Visual Studio, sry
}