如何将boost矩阵prod()函数作为乘法函数传递
how do I pass the boost matrix prod() function as a multiplies function?
我正在尝试执行矩阵求幂,但我不想复制/粘贴求幂函数,而是使用类模板。问题是,对于boost矩阵,要乘以矩阵,需要使用prod
函数(而不是operator*
)。
似乎g++无法找到我想要使用的模板。我用下面的代码得到的错误是
41:37: error: no matching function for call to 'my_pow(boost::numeric::ublas::matrix<int>&, int, <unresolved overloaded function type>)'
这是代码:
#include <iostream>
using namespace std;
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
typedef long long int64;
template <class T, class M> T my_pow(T b, int64 e, M mult)
{
if (e == 1) return b;
if (e % 2 == 1) return mult(b, my_pow(b, e - 1, mult));
T tmp = my_pow(b, e / 2, mult);
return mult(tmp, tmp);
}
template <class T> T my_pow(T b, int64 e) { return my_pow(b, e, multiplies<T>()); }
int main()
{
using namespace boost::numeric::ublas;
matrix<int> m(3, 3);
for (unsigned i = 0; i < m.size1(); ++i)
for (unsigned j = 0; j < m.size2(); ++j)
m(i, j) = 3 * i + j;
std::cout << m << std::endl;
std::cout << my_pow(m, 2, prod) << std::endl;
}
有什么方法可以将prod()传递给my_pow以使模板解析吗?谢谢
如果不清楚:b是基数,e是指数,my_pow是计算b^e
出现编译器错误的原因是prod
函数有许多重载,在调用my_pow
时,编译器需要知道要提供哪一个。编译器无法推断出您将把pow函数应用于函数的第一个参数,因此在这里它是不知所措的。
一种解决方案是显式将函数指针强制转换为正确的类型,但对于uBlas prod
重载,确定要强制转换的正确类型可能相当复杂。
另一种解决方案是创建一个多态函数对象,将其委托给适当的pow函数。请注意,下面的实现假设prod( m, m)
返回与m类型相同的值(或可转换为m的值),但这与my_pow
的假设相同,如果只能在运行时确定功率e
,则很难避免由此产生的临时性。
多态函数类的一个例子可以做到这一点:
struct my_prod
{
template< typename M>
M operator()( const M &left, const M &right) const
{
return prod( left, right);
}
};
现在,如果您将呼叫my_pow
更改为以下内容:
std::cout << my_pow(m, 2, my_prod()) << std::endl;
它应该起作用(对我来说)。
有两个问题。首先,prod
是一个模板化的函数,所以不能只将prod
作为函数指针传递。相反,您需要通过prod<...>
并填写特定的模板参数。
然而,在这种情况下,这仍然不能解决您的问题,因为即使有指定的模板参数,prod
仍然有几个重载,编译器也无法确定应该使用哪一个。可以通过声明一个指定参数和返回类型的函数指针来修复此问题。然而,由于ublas
使用复杂的模板元编程,这将是非常丑陋的,我不建议这样做。相反,我会围绕prod
编写一个包装函数来调用您想要的特定重载。这里有一个非常通用的包装器,应该可以与任何ublas矩阵一起使用:
template <class E1, class E2>
typename boost::numeric::ublas::matrix_matrix_binary_traits<
typename E1::value_type, E1,
typename E2::value_type, E2>::result_type
my_prod(const boost::numeric::ublas::matrix_expression<E1>& e1,
const boost::numeric::ublas::matrix_expression<E1>& e2)
{
return prod(e1, e2);
}
然后您可以使用my_prod
调用my_pow
,如下所示:
my_pow(m, 2, my_prod<matrix<int>, matrix<int> >)
不过,为了好玩,这里是解析模板参数和重载所需传递的函数指针声明。这声明了一个名为prod_ptr
的函数指针,它指向您想要的prod
的特定重载:
matrix_matrix_binary_traits<matrix<int>::value_type, matrix<int>, matrix<int>::value_type, matrix<int> >::result_type
(*prod_ptr)(const matrix_expression<matrix<int> >&, const matrix_expression<matrix<int> >&) =
&prod<matrix_matrix_binary_traits<matrix<int>::value_type, matrix<int>, matrix<int>::value_type, matrix<int> >::result_type, matrix<int>, matrix<int> >;
然后您可以使用函数指针调用my_pow
:
my_pow(m, 2, prod_ptr);
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::bind()类似的东西,但用于函数调用
- 赋值 boost::intrusive_ptr 而不调用构造函数?
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- 在 boost::variant 中类 holden 的复制构造函数存在问题
- 传递 boost::p ython::numpy::ndarray 作为 boost::p ython 函数的(默认或非
- 如何正确取消析构函数中的 Boost deadline_timer(在多线程环境中)?
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 如何通过 boost::p ython 重命名构造函数的关键字参数
- 无法将参数传递给 boost::thread 构造函数
- 如何将类成员函数与param绑定为boost::function的右值
- 调用boost v1.58中的函数时出现模板名称使用无效错误
- 为什么Boost Variant使用模板构造函数而不是Boost::beast::websocket::stream的移
- boost::bind函数缓冲区的最大大小
- 如何正确访问结构值并将其传递给函数 - boost::p ython
- std::bind() 错误:无法确定重载函数"boost::asio::io_service::run"的哪个实例
- 为什么在C++函数 boost::algorithm::join_if 中抛出 std::bad_cast 异常
- 错误:使用已删除的函数boost::shared_mutex::shared_互斥
- 传递一个成员函数来创建一个自由函数boost指针