选择模板成员函数的正确返回类型

ura歌

我有一个看起来像这样的模板类:

template <typename T, std::size_t M, std::size_t N> // MxN matrix with elements of type T
struct Mtx{...}

// component wise division
template <typename U> Mtx operator/(const Mtx<U, M, N> &rhs) const 
{ return componentDivide(*this, rhs); }

确保类似函数的返回类型operator /为“正确”的最佳方法是什么?

例如:

Mtx<float> * Mtx<unsigned> = Mtx<float>
Mtx<float> * Mtx<int>      = Mtx<float>
Mtx<float> * Mtx<double>   = Mtx<double>
Mtx<double> * Mtx<float>   = Mtx<double>
Mtx<short> * Mtx<int>      = Mtx<int>
昆汀

我个人倾向于decltype(std::declval<T>() / std::declval<U>())而不是std::common_type,因为它明确选择类型以反映实际的划分。

从而:

template <typename T>
struct Mtx 
{
    T _var;

    template <typename U> 
    Mtx<decltype(std::declval<T>() / std::declval<U>())>
    operator / (const Mtx<U> &rhs) const
    {
        return this->_var / rhs._var;
    }
};

或者,通过使用尾随返回类型,以便我们可以用参数的类型来表示它:

template <typename T>
struct Mtx 
{
    T _var;

    template <typename U> 
    auto operator / (const Mtx<U> &rhs) const
        -> Mtx<decltype(this->_var / rhs._var)>
    {
        return this->_var / rhs._var;
    }
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

模板或成员函数选择

如何获取函数返回类型的模板成员的解引用类型

C++在构造函数中选择类成员的模板类型

invoke_result获取模板成员函数的返回类型

使用模板化返回类型实例化虚拟成员函数

模板类的C ++成员函数的自动返回类型

模板类成员函数的完美转发返回类型

如果返回类型是数组,则禁用模板成员函数

根据单独的模板化成员来改变类的模板化成员函数的返回类型

模板函数重载(通用类型与模板模板类型)选择正确的重载

从成员函数返回模板类

让函数返回模板类型

使用类外部的模板类中的typedef成员作为成员函数的返回类型

成员函数的正确函数签名模板

推导成员函数的返回类型

让成员函数返回类型成为要返回的实际对象的超类的正确方法是什么?

模板与类成员函数的正确使用

根据模板类型选择类模板的成员类型?

模板化类的专门继承导致成员函数返回模板化类类型,而不是继承的类类型

C ++-14使用enable_if_t选择以整数类型为模板的类的成员函数

成员函数模板选择和SFINAE

确定模板函数的返回类型

具有未定义的成员函数返回类型的模板实例化

具有尾随返回类型的模板成员函数,即使未使用也会给出错误

如何使用非跟踪的decltype返回类型定义离线类模板成员函数

使用返回类型调用模板化的指针成员函数时出错

C函数的正确返回类型?

从函数返回类型推断模板参数类型

模板函数类型推导和返回类型