C++ 模板 类 和 Matlab Mex

C++ Template Classes and Matlab Mex

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

情况是这样的:说我已经写了一套非常好的 C++ 模板 classes 就像这样:

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 不同的参数选择 MyClassFooTypeBarType 是自定义的 typename,顺便说一句)。现在,如果我正在编写一个 C++ 程序来使用这些 classes,它看起来会非常简单:

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++ 模板设计,我在编译时有 selected 模板参数。到目前为止,这对我来说效果很好,我喜欢这个设计。

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

我曾想过让 "user" 每次想要选择不同的 FooTypeBarType 时重新编译 mex 文件,但这似乎也有点令人恼火 (对普通的 Matlab 用户来说)。感谢您的输入!

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

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

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