如何定义运算符,以便可以将用户定义类型的数组转换为基本类型数组?

时间:2016-07-11 10:10:10

标签: c++ containers implicit-conversion

我提供以下代码来说明我的问题:

#include <vector>

struct Complex
{
     int a, b, c;

     Complex() : a(3), b(4), c(10) {}

     operator int() const {  return a+b+c; }
};

int main()
{
   Complex abc;
   int value = (abc);
   Complex def;
   def.a = 20;
   int value2 = (def);

   std::vector<Complex> ar;
   ar.push_back(abc);
   ar.push_back(def);

   std::vector<int> ar2;
   ar2.push_back(abc);
   ar2.push_back(def);

   std::vector<int> ar3;
   ar3 = (ar);
}

由于表达式为ar3 = (ar),因此无法编译。我已声明了转换运算符,以便Complex类可用于预期int的位置。我是否也可以将Complex对象数组分配给int数组?

我尝试为Complex数组声明非成员转化运算符,但不允许这样做:

void std::vector<int> operator = (std::vector<Complex> complexArray)
{
    std::vector<int> abc;
    for(int i=0; i<complexArray.size(); i++)
     abc.push_back(complexArray[i]);
    return abc;
}

3 个答案:

答案 0 :(得分:4)

您可以考虑std::vector的范围构造函数。

std::vector<int> ar3(begin(ar), end(ar));

答案 1 :(得分:3)

每当你想要转换某些内容时,std::transform函数可能会很好用。

在您的情况下,您可以执行类似

的操作
// Create the new vector with the same size as the complex vector
std::vector<int> abc(complexArray.size());

std::transform(std::begin(complexVector), std::end(complexVector),
               std::begin(abc),
               [](Complex const& complex)
               {
                   int result;

                   // Code here that converts the complex structure to an integer
                   // and stores the integer in the variable result

                   return result;
               });

在上面的std::transform调用之后(一旦你完成了实际进行结构转换的代码),向量abc将包含来自Complex结构的所有转换整数。源向量complexVector

答案 2 :(得分:2)

忘记自动隐式转换(至少对于标准库容器)。但是,如果您愿意接受明确的转换,如下例所示

 const std::vector<int> vi {1, 2, 3, 4, 5};
 const std::vector<double> vd = container_cast(vi);

然后执行container_cast()实用程序。请注意,它不仅可以在不同元素类型(即std::vector<int>std::vector<double>)的同一模板容器的实例化之间进行转换,还可以在不同容器之间进行转换(例如std::vector到{{1} })。

std::list