2

テンプレートパラメータとして文字列を作成することは可能ですか? お気に入り

A<"Okay"> is a type.

任意の文字列 (std::string または c-string) で問題ありません。

4

2 に答える 2

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>さまざまなタイプがあります。

于 2013-07-11T16:05:48.607 に答える
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
}
于 2013-07-11T16:41:29.980 に答える