在 C++ 中,我想通过使用来自变量(例如字符串)的类型名信息从模板定义类对象。
例如这是模板类:
template<typename mtype>
class MyClass{
private:
mtype *a;
public:
....
}
这就是我想使用它的方式:
void main()
{
....
// read information from external sources, e.g. config file
std::string mtype_info=ReadFromConfigFile();
// create a MyClass object, using the translation function my_trans()
MyClass<my_trans(mtype_info)> m;
}
这样的事情可能吗?
编辑:
非常感谢您到目前为止的回答。我的想法已经比以前领先了几步。我可以尝试在此处提供更多背景信息。
MyClass 是 boost-library 随机概率分布对象的包装器。 MyClass 允许将不同类别的概率分布(例如 boost::random::normal_distribution、boost::random::binomial_distribution、boost::random::beta_distribution)创建为“抽象”MyClass 对象,这样一旦 MyClass object 初始化后,可以在代码中以相同的方式使用它。
template<typename mtype>
class MyClass{
private:
mtype* a;
public:
template<typename... Args>
MyClass(Args&&... args) {
a = new mtype{ std::forward<Args>(args)... };
}
~probability_distribution() {
delete a;
}
template<typename Engine, typename Seeder>
friend class random_engine;
};
用法是:
MyClass<boost::random::normal_distribution<double>> m1(1,2);
MyClass<boost::random::beta_distribution<double>> m2(2,4);
...
double r1 = g_rand.get(m1);
double r2 = g_rand.get(m2);
现在我想要的是来自配置文件的实际分发类型(boost 类引用和初始化参数)。
最佳答案
模板需要在编译时实例化,然后才能对它们进行操作。它们只是模板。您可以编写一些字符串映射到已经实例化的类型。以下解决方案假定您可以重构 MyClass<T>
有一个共同的基础:
struct MyClassBase {
virtual ~MyClassBase(){}
};
template<typename mtype>
class MyClass : public MyClassBase {
mtype *a;
};
然后您可以编写一个函数,该函数返回所需实例化的 MyClass
的实例。 :
std::unique_ptr<MyClassBase> make_MyClass(const std::string& s) {
if ( s == "string") { return std::unique_ptr<MyClassBase>(new MyClass<std::string>()); }
else if ( s == "int") { return std::unique_ptr<MyClassBase>(new MyClass<int>()); }
}
这仅适用于有限数量的类型(而原则上 MyClass
模板可以采用任何模板参数)。
PS:不太清楚为什么MyClass
是模板。如果这样做的动机是能够选择 mytype
的类型在运行时,这是错误的方法。
关于c++ - 在 C++ 中,我想通过使用来自变量(例如字符串)的类型名信息从模板定义类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58915081/