gpt4 book ai didi

c++ - 将构造函数添加到模板化类

转载 作者:搜寻专家 更新时间:2023-10-30 23:49:25 24 4
gpt4 key购买 nike

我有一个包含值的模板类。是否可以向类添加构造函数以允许隐式转换,如下例所示?

或者有更好的方法吗?

#include <string>

template<typename T>
class Value
{
public:
Value(const T& value) : m_value(value) { };
private:
T m_value;
};

// I thought adding something like this would do the trick but it does not work:
/*
template<>
class Value<std::string>
{
public:
Value(const char *sz) : m_value(sz) { };
}
*/

void f(const Value<std::string> &s)
{
}

int main()
{
f(std::string("hello"));

// I want to have this working:
f("hello");
}

最佳答案

使用字符串文字调用 f(const Value<std::string>&) 需要两次用户定义的转换( const char[] ==> std::string ==> Value<std::string> )以匹配函数参数,而标准只允许一次。
我看到解决这个问题的两种可能性:重载构造函数或重载 f()

假设您问的是前者,因为后者是不可能的,有几种方法可以重载构造函数。

您可以利用类模板的成员函数只有在被调用时才被编译的事实,并添加一个仅在 T 是特定类型时才编译的构造函数。当然,如果您的模板的用户为其他类型调用它,这将导致错误。但是,您可以通过使构造函数成为成员模板来接受它,而不是在其中看到问题:

template<typename U>
Value(const U& value) : m_value(value) { };

这样一来,任何可以转换为 T(当然还有 T 本身)的东西都可以用于 U

或者您可以将类专门化为 std::string 。不幸的是,你将不得不对整个类(class)进行特化,因为没有个别成员的选择性特化。因此,在这种情况下,您可能希望将所有代码移动到一个通用的(可能是 private 基类 Value 中,其中 Value 基模板仅定义转发给基类构造函数的构造函数,以及一个专门化 Value<std::string>,它添加另一个采用 const char* 的构造函数.

关于c++ - 将构造函数添加到模板化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4375224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com