最近,我的任务是将我的一些代码从C ++ 14重写为C ++ 03,以便我可以使用ompSs。但是,我不确定是否可以在不使用auto
的情况下重写此特定代码段。
我有一个模板类Field< Type >
,它是Type
的容器。来自片段的方法定义了两个字段求和的行为,作为字段中每个条目的总和。
Type
,可以是double
,也可以是自行设计的课程Vector
。该
Vector + Vector
,Vector + double
和double + 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;
}
答案 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 ) ...