2015-09-11 31 views
3

是否有可能超載此類呼叫?「str」和const char [N]之間的C++重載?

f("st");//variant 1 
struct Foo { char buf[3]; Foo() { strcpy(buf, "aa"); } }; 
const Foo foo; 
f(foo.buf);//variant 2 

在兩種情況下typeid給出相同的類型, 是任何變體的f兩個通話之間進行區分的上方, 並且具有f兩個變體?我嘗試std::is_rvalue_reference但沒有成功。

+2

'「st」'類型爲const char [N]'。 – Lingxi

+0

字符串常量是'const char [N]',它與'char [N]'不同。 –

+1

@ n.m。 'foo'也可以'const'修改。 – Lingxi

回答

6

如果Foo類型的對象不是const對象,你可以使用像

template<size_t N> 
void f(const char(&a)[N]) 
{ 
    std::cout << "const char[] version" << std::endl; 
} 

template<size_t N> 
void f(char(&a)[N]) 
{ 
    std::cout << "char[] version" << std::endl; 
} 

但如果對象是常量,比bufstring-literal具有等同類型(DIFF只能以符號數,即N),你不能區分它們。

文字串是由雙引號

普通字符串和UTF-8字符串文字包圍的字符序列(如在2.14.3中定義的) 也稱爲 爲窄字符串文字。窄字符串文字的類型爲「n const char的數組 」,其中n是如下定義的字符串的大小, 並且具有靜態存儲持續時間(3.7)。

+0

是的,我想區分const和const :( – user1244932

0

大廈ForEveR's answer 還值得討論爲什麼檢查字符串右值引用(STD :: is_rvalue_reference)是行不通的

我嘗試的std :: is_rvalue_reference但沒有成功。

這是因爲字符串文字實際上左值如5.1.1.1

文本是一個基本表達式表示。它的類型取決於它的形式(2.13)。一個字符串文字是一個左值;所有其他 文字是prvalues。

0

這是不可能的,因爲這兩個foo.buf"st"具有相同的類型:const char[3]

但是,如果更改buf類型,則可以區分它們。這可能是一個實際的解決方案。

struct Foo { 
    std::array<char, 3> buf; 
}; 

template<size_t N> 
void f(const char(&a)[N]) 
{ 
    std::cout << "const char[N] version" << std::endl; 
} 

template<size_t N> 
void f(const std::array<char, N>&) 
{ 
    std::cout << "const std::array[N] version" << std::endl; 
} 
相關問題