函数可以与用户定义的文字一起使用吗?用户定义的文字可以用作参数吗?
如果是这样,可以做什么样的诡计?这合法吗?
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++ 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)
正确的,函数名称是标识符,而不是文字。因此,用户定义的*文字*不适用于它们。 –
@MichaelPrice这是一个很好的方式来说明。 – Pubby
似乎任何合法的用法,我想想要的“函数文字”应该由lambda处理,无论如何,对吧? –
看看foo_bar
,它只是一个单一的词法标记。其解释为名为foo_bar
的单个标识符,而不是以foo
作为后缀_bar
。
号
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
}
我不知道,如果这增加了什么,但有从定义
PythonScript operator"" _python(const char*, std::size_t len) {...}
R"Py(
print "Hello, World"
)Py"_python;
其实,我觉得用户定义的文字将使一个很好的方式嵌入脚本或SQL什么阻止你。
我认为'''''用户定义文字的参数始终是'char *'和'size_t'不是吗? –