用户定义的文字可以将函数作为参数吗?

时间:2011-11-11 22:01:57

标签: c++ c++11 user-defined-literals

可以将功能与用户定义的文字一起使用吗?

如果是这样,可以做些什么恶作剧?这合法吗?

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 个答案:

答案 0 :(得分:7)

根据C ++ 2011年2月11日草案§2.14.8,用户文字类型是整数文字,浮动文字,字符串文字和字符文字。没有办法做函数 - 文字类型。

  

用户定义的文字被视为对文字运算符的调用   文字运算符模板(13.5.8)。确定此调用的形式   对于给定的用户定义的文字L和ud-suffix X,   查找其文字后缀标识符为X的literal-operator-id   在L的上下文中使用规则进行非限定名称查找   (3.4.1)。设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)

答案 1 :(得分:1)

查看foo_bar,它只是一个词汇标记。它被解释为名为foo_bar的单个标识符,而不是foo后缀为_bar

答案 2 :(得分:1)

没有

C ++故意避免这样的诡计,因为如果在你的例子中使用它之前没有立即定义符号foo_bar将非常难以理解。

你可以用预处理器实现类似的东西。

#define bar (1)

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

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

答案 3 :(得分:1)

我不知道这是否会增加任何内容,但没有什么可以阻止你定义

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

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

我实际上认为用户定义的文字可以很好地嵌入脚本或SQL。