2011-11-11 66 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什麼阻止你。

相關問題