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
不同的 FooType
和 m
不同的 BarType
,我有 n*m
不同的参数选择 MyClass
(FooType
和 BarType
是自定义的 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 FooType
和 BarType
- 基本上 Mex 文件编译所有可能的(n*m
) class 实例并将它们留在那里供 Matlab 使用。现在这似乎没问题(我有 n=3, m=2
),但它看起来也很草率且难以维护。
我曾想过让 "user" 每次想要选择不同的 FooType
和 BarType
时重新编译 mex 文件,但这似乎也有点令人恼火 (对普通的 Matlab 用户来说)。感谢您的输入!
我不熟悉 Mex;我只是一个 C++ 用户。如果没有直接的 MATLAB 支持 运行-time 库生成,你所描述的是不可能的,我认为这甚至不存在。您肯定需要在编译时预先实例化所有内容。这不简单。
正如您所说,问题在于模板都是在编译时生成的,直到 运行 时间所有类型信息都消失时才使用它们。假设 MATLAB 知道错位方案,错位的名称应该不是问题。
所以你必须在 C++ 级别解决这个问题。在 C++ 中,没有类型安全的方法来获取类型名称作为字符串。唯一的解决办法是使用宏来消除一些膨胀。这很不幸,因为如果可能的话,使用所有有效参数类型的 std::tuple
和一点递归模板魔术就可以得到一个非常优雅的解决方案。
我想知道是否有一种优雅的方法可以为 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
不同的 FooType
和 m
不同的 BarType
,我有 n*m
不同的参数选择 MyClass
(FooType
和 BarType
是自定义的 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 FooType
和 BarType
- 基本上 Mex 文件编译所有可能的(n*m
) class 实例并将它们留在那里供 Matlab 使用。现在这似乎没问题(我有 n=3, m=2
),但它看起来也很草率且难以维护。
我曾想过让 "user" 每次想要选择不同的 FooType
和 BarType
时重新编译 mex 文件,但这似乎也有点令人恼火 (对普通的 Matlab 用户来说)。感谢您的输入!
我不熟悉 Mex;我只是一个 C++ 用户。如果没有直接的 MATLAB 支持 运行-time 库生成,你所描述的是不可能的,我认为这甚至不存在。您肯定需要在编译时预先实例化所有内容。这不简单。
正如您所说,问题在于模板都是在编译时生成的,直到 运行 时间所有类型信息都消失时才使用它们。假设 MATLAB 知道错位方案,错位的名称应该不是问题。
所以你必须在 C++ 级别解决这个问题。在 C++ 中,没有类型安全的方法来获取类型名称作为字符串。唯一的解决办法是使用宏来消除一些膨胀。这很不幸,因为如果可能的话,使用所有有效参数类型的 std::tuple
和一点递归模板魔术就可以得到一个非常优雅的解决方案。