使用类型检查实现std :: vector的加法运算符

时间:2015-04-24 16:04:17

标签: c++ overloading operator-keyword stdvector

这是我对+ operator的{​​{1}}的实施。

std::vector<T>

它工作正常,大小异常也适用于以下代码。

//+ operator overloading
template <typename T> 
std::vector<T> operator+(std::vector<T> v1, const std::vector<T>& v2)
{
    if(v1.size() != v2.size())
    {
        throw std::exception("Two vector size must be same");
    }

    for(unsigned int i = 0; i<v1.size(); i++)
    {
        v1[i] += v2[i];
    }
    return v1;
}

但是我想在实现中添加一些类型检查,以便只调用//main function 1 std::vector<double> a,b,c; a.assign(4,2); b.assign(4,5); try{ c = a+b; } catch(std::exception& e) { std::cout<<e.what(); return -1; } +这个numerical types操作(例如int,double ...)。

因此,当我尝试+关于std::vector<std::string>的操作时,应该发生异常。

但目前的实施没有。

//main function 2
std::vector<std::string> a,b,c;

a.assign(4,"this");
b.assign(4,"is awesome!");

try{
    c = a+b;
}
catch(std::exception& e)
{
    std::cout<<e.what();
    return -1;
}

有什么办法吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

你说:

  

但是我想为实现添加一种类型检查,以便仅针对数值类型调用此+操作(例如。intdouble ...)。< / p>

您可以添加static_assert

template <typename T> 
std::vector<T> operator+(std::vector<T> v1, const std::vector<T>& v2)
{
   static_assert(std::is_arithmetic<T>::value, "Need arithmetic type");

答案 1 :(得分:-2)

看起来像是直接应用类型特征的案例:

#include <type_traits>

template <typename T> 
std::vector<T> operator+(std::vector<T> v1, const std::vector<T>& v2)
{
    if(v1.size() != v2.size())
    {
        throw std::exception("Two vector size must be same");
    }

    if (!std::is_arithmetic<T>::value)
    {
        throw std::exception("Only arithmetic vectors supported");
    }

    for(unsigned int i = 0; i<v1.size(); i++)
    {
        v1[i] += v2[i];
    }
    return v1;
}

因为&#34;算术&#34;是该类型的编译时属性,您可以更进一步使用静态断言而不是异常来获取编译时错误而不是运行时错误:

#include <type_traits>

template <typename T> 
std::vector<T> operator+(std::vector<T> v1, const std::vector<T>& v2)
{
    static_assert(std::is_arithmetic<T>::value, "Our vector operator + is intended for arithmetic types only");

    if(v1.size() != v2.size())
    {
        throw std::exception("Two vector size must be same");
    }

    for(unsigned int i = 0; i<v1.size(); i++)
    {
        v1[i] += v2[i];
    }
    return v1;
}

但是,正如@chris在评论中正确指出的那样:如果您想要动态调整大小的数字数组,您可能需要查看std::valarray