2016-12-01 10 views
3

私はそれがユーザ定義リテラルを作ることが可能だということを発見したとき、私が驚いたのテンプレート:文字列リテラルのテンプレート定義のユーザー定義リテラル(リテラルサフィックス)を作成できますか?

template <char ...C> std::string operator ""_s() 
{ 
    char arr[]{C...}; 
    return arr; 
} 

// ... 

std::cout << 123_s; 

しかし、宣言の上には、文字列リテラルでは動作しません:

"123"_s 

は私に次のエラーを与える:

prog.cpp: In function 'int main()':
prog.cpp:12:15: error: no matching function for call to 'operator""_s()'
std::cout << "123"_s;

prog.cpp:4:34: note: candidate: template std::string operator""_s()
template std::string operator ""_s()

prog.cpp:4:34: note: template argument deduction/substitution failed:

(Ideone)

文字列リテラルでもテンプレート化されたユーザー定義リテラルを使用する方法はありますか?

+0

何を達成したいですか? '' foo_s; 'を実行することはできませんので、失敗しないように引用符を付ける必要はありません。 –

+0

@ Jean-FrançoisFabre私は知っています。もちろん、実際のユースケースではありません。私は、文字列リテラルに基づいてユニークな型を生成できるようにしたい、それは可能な方法の一つかもしれません。 – HolyBlackCat

答えて

2

クランとGCCはあなたが

template<class CharT, CharT... Cs> 
std::string operator ""_s() { return {Cs...}; } 

を行うことができます。しかし、何も、標準C++には存在しない拡張をサポートしています。これを標準化するための提案は数回行われ、毎回却下されました。ほとんどの場合、テンプレートパラメータパックは実際にはという非効率的な方法で文字列を表現するためです。

+0

答えをありがとう。しかしそれは非効率的です、なぜ数字リテラル用のテンプレート版があるのですか? – HolyBlackCat

+1

@HolyBlackCat本来の根拠は、コンパイル時の計算に 'constexpr'を使うと便利だということでした。また、リテラルが一般的に短く、実装がないときに標準化されている(つまり、コンパイル時のコストは必ずしも明らかではない)ということを傷つけることはありません。 –

+3

標準委員会は私にコンパイル時のC++コンパイラを持たせたくありません。スポークポート。 – Yakk

関連する問題