函數可以與用戶定義的文字一起使用嗎?用戶定義的文字可以用作參數嗎?
如果是這樣,可以做什麼樣的詭計?這合法嗎?
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'不是嗎? –