2011-11-11 20 views
4

関数をユーザー定義リテラルで使用できますか?ユーザ定義のリテラルは引数として関数を持つことができますか?

もしそうなら、何ができますか?これは合法ですか?

void operator "" _bar(int (*func)(int)) { 
    func(1); 
} 

int foo(int x) { 
    std::cout << x << std::endl; 
} 

int main() { 
    foo(0); // print 0 
    foo_bar; // print 1 
} 
+0

私は、ユーザー定義リテラルの引数は常に 'char *'と 'size_t'であると思いますか? –

答えて

7

はC++ 2011年2月11日ドラフト§2.14.8によれば、ユーザリテラルのタイプは、文字列リテラル、文字リテラル - リテラル浮動、整数リテラルです。関数リテラル型を行う方法はありません。

ユーザ定義リテラルがリテラルオペレータ又は リテラルオペレータテンプレート(13.5.8)へのコールとして扱われます。 ud-接尾辞Xのある特定のユーザー定義リテラルLのこのコールの形式を確認するには、リテラル接尾辞の識別子がXの リテラル演算子IDを、Lのコンテキストで照合して、修飾されていない名前ルックアップ (3.4.1)。このルックアップによって見つかった宣言の集合をSとする。 S は空であってはならない。

整数:

operator "" X (n ULL) 
operator "" X ("n") 
operator "" X <’c1’, ’c2’, ... ’ck’>() 

はフローティング:

operator "" X (f L) 
operator "" X ("f") 
operator "" X <’c1’, ’c2’, ... ’ck’>() 

文字列:

operator "" X (str, len) 
operator "" X <’c1’, ’c2’, ... ’ck’>() //unoffcial, a rumored GCC extension 

文字:

operator "" X (ch) 
+2

右の関数名は識別子であり、リテラルではありません。したがって、ユーザー定義*リテラル*はそれらには適用されません。 –

+0

@MichaelPriceそれはそれを置くのに最適です。 – Pubby

+0

私は「関数リテラル」がラムダによって処理されることを望んでいると思っていたとしても、正当な使用法のようです。 –

1

foo_barを見てください。それは単なる字句トークンです。それはfoo_barという名前の単一の識別子として解釈され、fooの末尾には_barが付いていません。それはあなたの例では、その使用直前に定義されていなかった場合は、シンボルfoo_barはは理解することは非常に困難であるので、

1

C++は、意図的に、このようなペテンを回避することができます。

プリプロセッサと同様の処理を行うことができます。

#define bar (1) 

int foo(int x) { 
    std::cout << x << std::endl; 
} 

int main() { 
    foo(0); // print 0 
    foo bar; // print 1 
} 
1

これは何かを追加しますが、

PythonScript operator"" _python(const char*, std::size_t len) {...} 

R"Py(
    print "Hello, World" 
)Py"_python; 

を定義するからあなたを妨げるものは何も私は実際には、ユーザー定義リテラルはスクリプトやSQLを埋め込むための良い方法になるだろうと思うがない場合、私は知りません。

関連する問題