keyGenerator应该检查哪个数据类型作为参数给出,并将其转换为整数。它适用于float和double,但当试图将字符串转换为整数时,它不起作用。你知道为什么会这样吗?
#include <iostream>
#include <typeinfo>
#include <string>
#include <cmath>
using namespace std;
template<typename T>
class KeyValueKnot
{
public:
T value;
int key;
KeyValueKnot *next;
KeyValueKnot(T value)
{
this->value = value;
this->key = keyGenerator(value);
this->next = NULL;
}
int keyGenerator(T value)
{
if (typeid(value) == typeid(std::string))
{
return (int) generateNumberFromString(value);
}
else if (typeid(value) == typeid(double))
{
return static_cast<int>(value);
}
else if (typeid(value) == typeid(int))
{
return value;
}
else
{
std::cout << "Unknown type" << std::endl;
}
}
int generateNumberFromString(string str)
{
int result = 0;
for (char c : str)
{
result += static_cast<int>(c);
}
return result;
}
};
1条答案
按热度按时间aurhwmvo1#
你的
if
是在 * 运行时 * 计算的,所以所有的分支都需要在 * 编译时 * 有效。然而,当
T
不是std::string
时,表达式generateNumberFromString(value)
对于任何不能 * 隐式 * 转换为std::string
的T
类型都无效。而且,当
T
是std::string
时,表达式static_cast<int>(value)
和return value;
无效,因为std::string
不能转换为int
。为了解决这个问题,你需要使用
if constexpr
(或者SFINAE或模板专门化,如果你使用的是C++17之前的编译器),所以if
分支在 * 编译时 * 计算,允许编译器删除未使用的分支,例如:有关
static_assert
中需要always_false_v
的原因,请参阅How can I create a type-dependent expression that is always false?(提示:如果没有它,代码将 * 总是 * 失败,并出现assert错误!).