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
}
4

4 に答える 4

7

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’&gt;()

フローティング:

operator "" X (f L)
operator "" X ("f")
operator "" X <’c1’, ’c2’, ... ’ck’&gt;()

弦:

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

キャラクター:

operator "" X (ch)
于 2011-11-11T22:10:38.667 に答える
1

を見てくださいfoo_bar。これは単なる 1 つの語彙トークンです。という接尾辞が付いたfoo_barものではなく、という名前の単一の識別子として解釈されます。foo_bar

于 2011-11-11T22:04:43.523 に答える
1

いいえ。

シンボル 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
}
于 2011-11-11T22:09:07.410 に答える
1

これが何かを追加するかどうかはわかりませんが、定義を妨げるものは何もありません

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

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

実際、ユーザー定義のリテラルは、スクリプトや SQL を埋め込む良い方法になると思います。

于 2012-01-15T03:17:11.400 に答える