gpt4 book ai didi

c++ - 禁用 Eigen 表达式到 const 引用的临时绑定(bind)

转载 作者:搜寻专家 更新时间:2023-10-31 02:20:00 26 4
gpt4 key购买 nike

我正在尝试编写一个只接受通过 const 传递的左值特征表达式的函数引用。我的第一个想法是只保留重载 const Eigen::MatrixBase<Derived>&delete Eigen::MatrixBase<Derived>&&一。令我惊讶的是,delete d 函数不是重载候选集的一部分。所以我尝试了下面的代码

#include <iostream>
#include <Eigen/Dense>

#define PRINT_MY_NAME std::cout << __PRETTY_FUNCTION__ << '\n'

template<typename Derived>
void f(const Eigen::MatrixBase<Derived>&) // (1)
{
PRINT_MY_NAME;
}

template<typename Derived>
void f(Eigen::MatrixBase<Derived>&&) // (2)
{
PRINT_MY_NAME;
}

int main()
{
Eigen::MatrixXd A;

f(A); // invokes (1)
f(A + A); // invokes also (1) !!!
}

哪个输出(gcc5.2)

void f(const Eigen::MatrixBase&) [with Derived = Eigen::Matrix < double, -1, -1>]

void f(const Eigen::MatrixBase&) [with Derived = Eigen::CwiseBinaryOp < Eigen::internal::scalar_sum_op < double>, const Eigen::Matrix < double, -1, -1>, const Eigen::Matrix < double, -1, -1> >]

很明显没有考虑右值重载。现在我很清楚第二个不是更好的匹配,因为我传递了一个右值特征表达式,它可以转换为 Eigen::MatrixBase<> , 但不是完全相同的类型。现在是我的问题:

  • 如何禁用或检测作为 f 的参数传递的右值特征表达式?问题在于表达式可以具有任意类型(Eigen 使用表达式模板),例如 CwiseBinaryOp<...CwiseBinaryOp<...>>等等。这是一个更大问题的一部分,在这个问题中我有一个类似于实用程序 make 的函数,它接受一个左值并将其绑定(bind)到 const。类中的引用表达式。如果表达式是一个右值,那么所有的赌注都不成立,因为引用绑定(bind)不是通过构造函数参数传播的,所以我想禁止传递右值 Eigen 表达式。

最佳答案

我想我找到了原因:表达式模板 A + A 的结果是 const,因此存在 CV 不匹配。将 const 添加到第二个重载中即可:

template<typename Derived>
void f(const Eigen::MatrixBase<Derived>&&) // (2)
{
PRINT_MY_NAME;
}

关于c++ - 禁用 Eigen 表达式到 const 引用的临时绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33201938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com