不同的值取决于 C++ 类型
Different value depending on type C++
我希望根据输入变量的类型有不同的变量值。
代码:
template <typename T>
int getValue(vector<T> & data)
{
return something; // There should be 0 for int and 1 for double
}
有人知道如何实现这样的功能吗?
如果您只是处理 int
和 double
,那么您可以为不同类型的向量重载函数。
int getValue(vector<int> & data)
{
return 0;
}
int getValue(vector<double> & data)
{
return 1;
}
如果您想保留 getValue
作为模板函数并专用于 int
和 double
,那么您可以使用
template<typename T>
int getValue(std::vector<T> & data)
{
return -1;
}
template <>
int getValue(std::vector<int> & data)
{
return 0;
}
template <>
int getValue(std::vector<double> & data)
{
return 1;
}
您可以在保留模板的同时提供非模板重载。由于函数解析更喜欢非模板匹配而不是模板。示例:
template <typename T>
int getValue( std::vector<T> & data )
{
return -1; // default template
}
int getValue( std::vector<int> & data )
{
return 0; // int overload
}
int getValue( std::vector<double> & data )
{
return 1; // double overload
}
这是一个使用专业化的例子:
template <typename T>
int getValue( std::vector<T> & data )
{
return -1; // default template
}
template <>
int getValue<int>( std::vector<int> & data )
{
return 0; // int specialization
}
template <>
int getValue<double>( std::vector<double> & data )
{
return 1; // double specialization
}
类型操作的两个重要运算符是 typeid 和 decltype。
typeid return 具有类型信息的对象 type_info。
验证类型的一些方法是:
- std::is_same
- typeid
- 函数重载
如果您使用的是 c++11,更好的选择应该是 std::is_same 和 delctype(检测变量的类型),因为它是编译时分辨率。
vector<int> integers;
vector<double> doubles;
cout << is_same<vector<int>, decltype(integers)>::value << endl;
cout << is_same<vector<int>, decltype(doubles)>::value << endl;
cout << is_same<vector<double>, decltype(integers)>::value << endl;
cout << is_same<vector<double>, decltype(doubles)>::value << endl;
如果您使用的是标准 C++ (c++98),则可以使用 typeid 运算符
vector<int> vectorInt;
vector<int> integers;
vector<double> doubles;
cout << ( typeid(integers) == typeid(vectorInt) ) << endl;
cout << ( typeid(doubles) == typeid(vectorInt) ) << endl;
您可以使用函数重载和模板来解析此类型,而不会出现意外中断。
这样是不是需要给每个类型都写一个函数来识别,不然模板函数会return-1(未知)像识别一样。
template<typename T>
int getTypeId(T) {
return -1;
}
int getTypeId(vector<int>) {
return 1;
}
main() {
vector<int> integers;
vector<double> doubles;
vector<char> chars;
cout << getTypeId(integers) << endl;
cout << getTypeId(doubles) << endl;
cout << getTypeId(chars) << endl;
}
我希望根据输入变量的类型有不同的变量值。 代码:
template <typename T>
int getValue(vector<T> & data)
{
return something; // There should be 0 for int and 1 for double
}
有人知道如何实现这样的功能吗?
如果您只是处理 int
和 double
,那么您可以为不同类型的向量重载函数。
int getValue(vector<int> & data)
{
return 0;
}
int getValue(vector<double> & data)
{
return 1;
}
如果您想保留 getValue
作为模板函数并专用于 int
和 double
,那么您可以使用
template<typename T>
int getValue(std::vector<T> & data)
{
return -1;
}
template <>
int getValue(std::vector<int> & data)
{
return 0;
}
template <>
int getValue(std::vector<double> & data)
{
return 1;
}
您可以在保留模板的同时提供非模板重载。由于函数解析更喜欢非模板匹配而不是模板。示例:
template <typename T>
int getValue( std::vector<T> & data )
{
return -1; // default template
}
int getValue( std::vector<int> & data )
{
return 0; // int overload
}
int getValue( std::vector<double> & data )
{
return 1; // double overload
}
这是一个使用专业化的例子:
template <typename T>
int getValue( std::vector<T> & data )
{
return -1; // default template
}
template <>
int getValue<int>( std::vector<int> & data )
{
return 0; // int specialization
}
template <>
int getValue<double>( std::vector<double> & data )
{
return 1; // double specialization
}
类型操作的两个重要运算符是 typeid 和 decltype。
typeid return 具有类型信息的对象 type_info。
验证类型的一些方法是:
- std::is_same
- typeid
- 函数重载
如果您使用的是 c++11,更好的选择应该是 std::is_same 和 delctype(检测变量的类型),因为它是编译时分辨率。
vector<int> integers;
vector<double> doubles;
cout << is_same<vector<int>, decltype(integers)>::value << endl;
cout << is_same<vector<int>, decltype(doubles)>::value << endl;
cout << is_same<vector<double>, decltype(integers)>::value << endl;
cout << is_same<vector<double>, decltype(doubles)>::value << endl;
如果您使用的是标准 C++ (c++98),则可以使用 typeid 运算符
vector<int> vectorInt;
vector<int> integers;
vector<double> doubles;
cout << ( typeid(integers) == typeid(vectorInt) ) << endl;
cout << ( typeid(doubles) == typeid(vectorInt) ) << endl;
您可以使用函数重载和模板来解析此类型,而不会出现意外中断。
这样是不是需要给每个类型都写一个函数来识别,不然模板函数会return-1(未知)像识别一样。
template<typename T>
int getTypeId(T) {
return -1;
}
int getTypeId(vector<int>) {
return 1;
}
main() {
vector<int> integers;
vector<double> doubles;
vector<char> chars;
cout << getTypeId(integers) << endl;
cout << getTypeId(doubles) << endl;
cout << getTypeId(chars) << endl;
}