取决于类型C ++的不同值

时间:2015-10-12 12:41:39

标签: c++ generic-programming

我想根据输入变量的类型设置不同的变量值。 代码:

template <typename T>
int getValue(vector<T> & data)
{
    return something; // There should be 0 for int and 1 for double
}

有谁知道如何实现这样的功能?

3 个答案:

答案 0 :(得分:5)

如果您只是处理intdouble,那么您可以为不同类型的向量重载函数。

int getValue(vector<int> & data)
{
    return 0;
}

int getValue(vector<double> & data)
{
    return 1;
}

如果您想将getValue作为模板功能并专注于intdouble,那么您可以使用

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;
}

Live Example

答案 1 :(得分:2)

您可以在保留模板的同时提供非模板重载。由于功能解析优先于模板上的非模板匹配。例如:

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
}

答案 2 :(得分:0)

键入操作的两个重要操作符是typeid和decltype。

typeid返回带有类型信息的对象type_info。

验证类型的一些方法是:

  • 的std :: is_same
  • typeid的
  • 功能过载

如果你使用的是c ++ 11,那么更好的选择应该是带有delctype的std :: is_same(检测变量的类型),因为它是编译时间分辨率。

    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;

您可以使用函数重载和模板来解决此类型而不会出现意外中断。

这样你需要为每个类型编写一个函数来识别,或者模板函数将返回-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;
}