2011-11-11 101 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

似乎任何合法的用法,我想想要的“函数文字”应该由lambda处理,无论如何,对吧? –

1

看看foo_bar,它只是一个单一的词法标记。其解释为名为foo_bar的单个标识符,而不是以foo作为后缀_bar

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

我不知道,如果这增加了什么,但有从定义

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

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

其实,我觉得用户定义的文字将使一个很好的方式嵌入脚本或SQL什么阻止你。

相关问题