我正在尝试创建一个名为 duo
的类。
duo
是一个类,它存储任何类型的对象 T
以及 std::string
这是“文本"T
对象的版本。 (例如,如果 T
是一个 int
,比如 861
,那么它的字符串版本将是 "861"
.)
想法是有一个显示字符串和一个值。我计划使用 VALUE
来比较两个 duo
,而 NAME
将在我需要时用于显示字符串。
它应该能够从 std::string
或 T
构造。换句话说,如果我说
std::string num("861");
duo<int> anumber(num);
这将创建与我创建的对象相同的对象
duo<int> anumber(861);
它的目的是将两者进行转换和存储,以便以后可以使用它们而不必再次调用转换函数。我需要能够访问“值”和“名称”。
如果 duo
是使用“普通版本”构建的(传递 std::string
),VALUE
将从 名称
。如果它是使用“模板化版本”构造的(传递类型为 T
的对象),NAME
将从 value
转换而来。
template< class T >
class duo
{
private:
T VALUE;
std::string NAME;
public:
// Templated version
duo( const T& value );
// Normal version
duo( const std::string& name );
};
T
有什么办法可以是 std::string
吗?我该怎么做呢?谢谢。
最佳答案
您需要模板特化。请看下面的代码:
template< class T >
class duo
{
private:
T VALUE;
std::string NAME;
public:
// Templated version
duo( const T& value ) : NAME(value), VALUE(value) // please make sure that NAME(value) works!
{
std::cout<<"template version";
}
};
template<>
class duo<std::string>
{
private:
std::string VALUE;
std::string NAME;
public:
// Normal version
duo( const std::string& name ): NAME(name), VALUE(name)
{
std::cout<<"normal version";
}
};
int main()
{
duo<std::string> d(std::string("abc")); // normal version
// duo<int> d2(1); // templated version
return 0;
}
duo<int> d2(1)
不起作用,因为 int
无法隐式转换为 std::string
.这是您下一步应该做的。
这是链接:http://en.cppreference.com/w/cpp/language/template_specialization
编辑
如果你想专门化构造函数:
template< class T >
class duo
{
private:
T VALUE;
std::string NAME;
public:
// Templated version
template<class V>
duo(const V& value)
{
std::cout<<"template version";
}
// Normal version
duo(const std::string &name)
{
std::cout<<"normal version";
}
};
关于c++ - 与模板化成员方法同名的普通成员方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41261908/