gpt4 book ai didi

C++ 模板类和 Matlab Mex

转载 作者:行者123 更新时间:2023-11-30 05:40:08 25 4
gpt4 key购买 nike

我想知道是否有一种优雅的方法可以为模板化 C++ 代码编写 Matlab/Mex 接口(interface)。

情况是这样的:假设我写了一组非常好的 C++ 模板类,如下所示:

template<FooType T>
Foo{
private:
//Some data
public:
//Constructors, methods
};

template<BarType S>
Bar{
private:
//Some data
public:
//Constructors, methods
};

template<FooType T, BarType S>
MyClass{
private:
Foo<T> *D;
Bar<S> *M;
public:
//Constructors, methods
};

如果我说,n 个不同的 FooTypem 个不同的 BarType,我有 n*m MyClass 的不同参数选择(FooTypeBarType 是自定义的 typename,顺便)。现在,如果我正在编写一个 C++ 程序来使用这些类,它看起来会非常简单:

int main()
{
Foo<fooType1> *F = new Foo<fooType1>(params);
Bar<barType3> *B = new Bar<barType3>(params);

MyClass<fooType1,barType3> *M = new MyClass(F,B);

M->doThing();

return 0;
}

我编译了 main.cpp 并运行它,很高兴。这是有效的,因为我在编译时根据 C++ 模板设计选择了模板参数。到目前为止,这对我来说效果很好,我喜欢这个设计。

现在假设我想编写与 main.cpp 相同类型的程序,但使用 Matlab 作为脚本语言和我的 classes.hpp 的 Mex 接口(interface)。想要这样做的主要原因是我的代码是现有 matlab 包的附加组件。有没有一种优雅的方法来编写我的 mex 文件,以便我可以访问每一对可能的模板参数?我开始做的是用大量 switch 语句编写我的接口(interface)文件,以便我可以选择 FooTypeBarType - 基本上 Mex 文件编译所有可能的(n*m) 类实例并将它们留在那里供 Matlab 使用。现在这似乎没问题(我有 n=3, m=2),但它看起来也很草率且难以维护。

我曾考虑过让“用户”每次想要选择不同的FooTypeBarType 时都重新编译mex 文件,但这似乎也有点令人恼火(无论如何对普通的 Matlab 用户来说)。感谢您的意见!

最佳答案

我不熟悉 Mex;我只是一个 C++ 用户。如果没有对运行时库生成的直接 MATLAB 支持,你所描述的是不可能的,我认为这甚至不存在。您肯定需要在编译时预先实例化所有内容。这并不简单。

正如您所说,问题在于模板都是在编译时生成的,直到运行时才使用它们,此时所有类型信息都消失了。假设 MATLAB 知道改编方案,经过改编的名称应该不是问题。

因此您必须在 C++ 级别解决此问题。在 C++ 中,没有类型安全的方法来获取类型名称作为字符串。唯一的解决办法是使用宏来消除一些膨胀。这很不幸,因为如果可能的话,使用所有有效参数类型的 std::tuple 和一点递归模板魔法,将可能有一个非常优雅的解决方案。

关于C++ 模板类和 Matlab Mex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31883531/

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