1

我的问题的精简版:

我想合并这两个功能:

void Bar(const std::string &s);
void Bar(const std::wstring &s);

..整合到一个模板化函数中:

template <class CharType>
void Foo(const std::basic_string<CharType> &s);

而且我认为我将能够Foo(1)and一样调用(2),但令我惊讶的是,它甚至不起作用(3)

(1) Foo("my string");
(2) Foo(std::string("my string"));
(3) Foo(std::basic_string<char>("my string"));

我尝试删除const参数的限定符s,甚至删除引用 ( ),或者使用而不是&调用,但结果都相同。lvaluesrvalues

编译器(gcc 和 VS - 所以我很确定这是符合标准的行为)无法推断Foo. 当然,如果我打电话给Foolike ,它会起作用Foo<char>(...)

所以我想了解为什么会这样,特别是因为调用(3)是调用参数对象的类型和函数参数类型之间的一对一类型。

其次,我想要一个解决方法:能够使用一个模板函数,并且能够像(1)and一样调用它(2)

编辑

(2)(3)做工作。我在我的编译器中声明它是错误的(不像我的问题):

template <class CharType>
    void Foo(const std::basic_string<char> &s);

对于那个很抱歉。

4

1 回答 1

3

1) 不起作用,因为您尝试使用const char[10]而不是 std::string

2)应该可以工作,3)因为默认模板参数应该确保您使用默认值

#include <iostream>
using namespace std;

template <class CharType>
void Foo(const std::basic_string<CharType> &s)
{
    cout << s.c_str(); // TODO: Handle cout for wstring!!!
}

void Foo(const char *s)
{
    Foo((std::string)s);
}

int main()
{
    std::wstring mystr(L"hello");
    Foo(mystr);

    Foo("world");

    Foo(std::string("Im"));

    Foo(std::basic_string<char>("so happy"));

    return 0;
}

http://ideone.com/L63Gkn

处理模板参数时要小心。我还为 wstring 提供了一个小重载,看看是否适合你。

于 2014-01-08T14:10:02.607 回答