我有一个生成随机数的函数。问题是我在模板类中使用它,其中T可以是int或string。当我选择字符串时,我收到有关无法转换的错误。如何返回一个整数并根据模板类型将其分配给字符串?
CTable(){
for (int i = 0; i < 10; i++){
int row = GenerateNumber();
int col = GenerateNumber();
T value = GenerateNumber(); //problem here when T is string
CCellDescr c(row, col, value);
cells.push_back(c);
}
}
int GenerateNumber(){
int number = rand() % 10 + 1;
return number;
}
答案 0 :(得分:8)
您可以创建一个帮助程序模板来执行转换,并将其专门化为T
类型。例如:
#include <iostream>
#include <string>
int GenerateNumber()
{
int number = rand() % 10 + 1;
return number;
}
template<typename T>
T convert(int value)
{
return value;
}
template<>
std::string convert(int value)
{
return std::to_string(value);
}
template<typename T>
class CTable
{
public:
CTable()
{
for (int i = 0; i < 10; i++)
{
int row = GenerateNumber();
int col = GenerateNumber();
T value = convert<T>(GenerateNumber());
std::cout << "'" << value << "'\n";
}
}
};
int main()
{
CTable<std::string> table;
return 0;
}
'8'
'6'
'10'
'8'
'4'
'7'
'2'
'10'
'3'
'6'
答案 1 :(得分:0)
您还可以专门化模板化函数以不同方式处理字符串
#include <cstdlib>
#include <string>
template<class T>
class CTable
{
public:
CTable();
};
从类中删除了构造函数的定义。通常情况下,我对此有所了解,因为你获得了比分离模板定义和实现所带来的好处更多的可能性,但这里有效。
int GenerateNumber()
{
int number = rand() % 10 + 1;
return number;
}
生成数字功能不变。
std::string randomStrings[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
template<>
CTable<std::string>::CTable()
{
std::string value = randomStrings[GenerateNumber()];
}
string
的模板构造函数实现。这使用随机数作为字符串数组的索引。不是超级随机,但它得到了重点。
template<class T>
CTable<T>::CTable()
{
T value = GenerateNumber();
}
其他一切的模板构造函数实现。
class foo
{
};
快速课程,演示如何使这个解决方案失败。
int main()
{
CTable<int> a;
CTable<std::string> b;
CTable<foo> c; // awwww shoot. Need protection from foos too.
}
快速main
尝试全部。