c ++ 03

时间:2017-05-16 07:20:35

标签: c++

最近,我的任务是将我的一些代码从C ++ 14重写为C ++ 03,以便我可以使用ompSs。但是,我不确定是否可以在不使用auto的情况下重写此特定代码段。

我有一个模板类Field< Type >,它是Type的容器。来自片段的方法定义了两个字段求和的行为,作为字段中每个条目的总和。

Type,可以是double,也可以是自行设计的课程Vector。该 Vector + VectorVector + doubledouble + Vector的行为在类Vector的定义中已完全定义。

代码段能够完全定义的预期行为 Field在其中的四种可能情景的总和:

  • Field< double > + Field< Vector >
  • Field< Vector > + Field< double >
  • Field< double > + Field< double >
  • Field< Vector > + Field< Vector >

这是通过创建response Field来完成的,其中Type是由两个向量的第一个元素求和的结果推断出来的。

如何在不使用令人敬畏的auto的情况下完成同样的事情 操作

template< typename Type_1, typename Type_2 > const auto operator+ (
const Field< Type_1 >& lhs, const Field< Type_2 >& rhs ) {

    auto response = Field <
       typename std::remove_const<decltype( lhs.get(0) + rhs.get(0) )>::type
    >( lhs.size() );

    for( size_t i = 0; i < lhs.size(); i++ ){
        response[i] = lhs.get(i) + rhs.get(i);
    }
    return response;
}

2 个答案:

答案 0 :(得分:2)

我很确定你在这里运气不好。问题主要在于,如果不指定返回类型,则无法选择operator+的特定重载,因此无法在C ++ 03中单独检索它。

然而,您可以做的是编写一个提供正确返回类型的元函数。如果您还使用此函数来定义operator+重载,您将获得相同的编译时保证和足够好的错误:

template <typename Lhs, typename Rhs>
struct AddResult;

template <>
struct AddResult<Vector, Vector> { typedef Vector result_type; }
// ...

typename AddResult<Vector, Vector>::result_type operator+(Vector lhs, Vector rhs)
// ...

template< typename Type_1, typename Type_2 >
Field<typename AddResult<Type_1, Type_2>::result_type>
operator+ (const Field<Type_1>& lhs, const Field<Type_2>& rhs)
{
    Field<typename AddResult<Type_1, Type_2>::result_type> response(lhs.size());

    for (size_t i = 0; i != lhs.size(); i++) {
        response[i] = lhs.get(i) + rhs.get(i);
    }
    return response;
}

离漂亮很远,但我想不出更好的解决方案。

答案 1 :(得分:1)

您始终可以使用显式类型替换auto。 在这种情况下,您可以添加模板参数(到模板的前面,以便仍然可以推断出Type1和Type2),并在调用站点指定结果类型。

template<typename Result, typename Type_1, typename Type_2 > 
const Result operator+ ( const Field< Type_1 >& lhs, const Field< Type_2 >& rhs ) ...