相关疑难解决方法(0)

理解移动语义与模板元编程的好处

我已经阅读了关于C++ 11中移动语义的一些描述,我想知道它可以在什么上下文中使用.目前,许多C++数学库使用模板元编程来延迟评估.

如果M = A + B + C*D,其中M,A,B,C和D是矩阵,则模板元编程允许避免无用的副本.移动语义是一种更方便的方式来做这些事吗?

如果不是,则在什么上下文中使用移动语义.如果是,与模板元编程相比,这种用途有什么区别/限制?

c++ templates move-semantics c++11

17
推荐指数
2
解决办法
1715
查看次数

如何集成使用表达式模板的库?

我想在我的程序中使用Eigen矩阵库作为线性代数引擎.Eigen使用表达式模板来实现延迟评估并简化循环和计算.

例如:

#include<Eigen/Core>

int main()
{
  int size = 40;
  // VectorXf is a vector of floats, with dynamic size.
  Eigen::VectorXf u(size), v(size), w(size), z(size);
  u = 2*v + w + 0.2*z;
}
Run Code Online (Sandbox Code Playgroud)

由于Eigen使用表达式模板,代码如

u = 2*v + w + 0.2*z;
Run Code Online (Sandbox Code Playgroud)

在上面提到的样品中,减少到长度为10的单个环(不是40,浮子被4个块放入调节器中)而不会产生临时的.多么酷啊?

但如果我像这样集成库:

class UsingEigen
{
    public:  
        UsingEigen(const Eigen::VectorXf& data):
            data_(data)
        {}

        UsingEigen operator + (const UsingEigen& adee)const
        {
            return UsingEigen(data_ + adee.data_);
        }

        ...
    private:
        Eigen::VectorXf data_;
}
Run Code Online (Sandbox Code Playgroud)

那么表达式就像:

UsingEigen a, b, c, d;
a = b + c …
Run Code Online (Sandbox Code Playgroud)

c++ templates encapsulation expression-templates eigen

17
推荐指数
1
解决办法
1178
查看次数

第三方类型是否应该在我的C++库的API中公开

我正在开发一个C++库,用户将提供复杂的输入,例如矩阵和四元数.我不想重新实现这些类型,因此,在内部,我将使用Eigen库.

我正在尝试确定将这些类型公开给我的库客户端的最佳方法,并为我的API提供了一些选项.我使用四元数类型作为示例,但这可以同样适用于矩阵等.此外,虽然我特别谈到暴露Eigen的类型,但我想这个问题同样适用于其他使用的外部库.

1)仅使用基本的C++类型

此选项将要求客户端通过基本类型传递数据.例如,对于传入四元数(4个元素),可以执行以下操作:

void my_func(double my_quat[4])
Run Code Online (Sandbox Code Playgroud)

2)暴露本征的类型

Eigen为数组和四元数提供了几种模板化类型.例如,如果一个函数需要一个四元数,我可以使用Eigen的Quaterniond 类型(它实际上是一个typedef Quaternion<double>):

void my_func(const Eigen::Quaterniond& my_quat)
Run Code Online (Sandbox Code Playgroud)

3)为客户端的各种类型创建一个简单的包装器

我可以创建一个非常简单的四元数类型(比方说,某种简单的结构),客户端必须创建(可能通过某种工厂函数)传递给我的API:

void my_func(const quaternion_t& my_quat)
Run Code Online (Sandbox Code Playgroud)

我的库会将quaternion_t类型转换为我的内部特征表示.

我不太喜欢选项1,因为我希望在我的API中有更强的输入感.选项2将要求我的客户也使用Eigen,更不用说他们使用不同版本的Eigen时兼容性的潜在问题(顺便说一下,如果重要的话,Eigen是一个只有头的库).这留下了选项3.

人们怎么想?我基本上回答了自己的问题吗?有什么例子吗?

相关问题

这里提出一个相关的问题,但没有详细说明是否应该公开外部类型.

c++ api

5
推荐指数
1
解决办法
819
查看次数

预编译特征头

我正在 Windows 操作系统上使用 Eclipse 构建一个 C++ 项目,我也在使用 Eigen 线性代数库。我的问题是 Eigen 的编译时间很慢(大约 50 秒)。

我已经尝试过这些建议的解决方案:

我真的需要一个解决方案,每次我构建项目来测试一些东西时都等待 47 秒是非常不切实际的。

任何想法都非常感谢,谢谢。

c++ eclipse compilation precompiled-headers

5
推荐指数
1
解决办法
1649
查看次数