関数はユーザー定義のリテラルで使用できますか?
もしそうなら、どのようなシェナニガンを行うことができますか?これは合法ですか?
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
}
関数はユーザー定義のリテラルで使用できますか?
もしそうなら、どのようなシェナニガンを行うことができますか?これは合法ですか?
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
}
C++11 Feb 2011 Draft § 2.14.8 によると、ユーザー リテラルの型は整数リテラル、浮動リテラル、文字列リテラル、および文字リテラルです。関数リテラル型を行う方法はありません。
ユーザー定義リテラルは、リテラル演算子またはリテラル演算子テンプレート (13.5.8) の呼び出しとして扱われます。ud-suffix X を持つ特定の user-defined-literal L のこの呼び出しの形式を決定するために、リテラル接尾辞 ID が X であるliteral-operator-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)
を見てくださいfoo_bar
。これは単なる 1 つの語彙トークンです。という接尾辞が付いたfoo_bar
ものではなく、という名前の単一の識別子として解釈されます。foo
_bar
いいえ。
シンボル foo_bar は、例で使用する直前に定義されていない場合、理解するのが非常に難しいため、C++ は意図的にそのようなシェナニガンを回避します。
プリプロセッサで同様のことを実現できます。
#define bar (1)
int foo(int x) {
std::cout << x << std::endl;
}
int main() {
foo(0); // print 0
foo bar; // print 1
}
これが何かを追加するかどうかはわかりませんが、定義を妨げるものは何もありません
PythonScript operator"" _python(const char*, std::size_t len) {...}
R"Py(
print "Hello, World"
)Py"_python;
実際、ユーザー定義のリテラルは、スクリプトや SQL を埋め込む良い方法になると思います。