c++ - 在 C++ 中,我想通过使用来自变量(例如字符串)的类型名信息从模板定义类对象

标签 c++ templates

在 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/

相关文章:

c++ - 如何可移植地将 std::system_error 异常与 std::errc 值进行比较?

c++ - 从 libcuda.so.1 调用的 __pthread_getspecific 中的段错误

python - 获取模板中所有自定义用户的列表(Django)

c++ - 如何使用模板函数减去两个对象?

c++ - 忽略模板特化并显式使用非特化模板 (std::vector<bool>)

c++ - make_transform_iterator 作为 thrust::reduce 算法中的第二个参数有什么意义?

c++ - 使用 auto_ptr<std::ofstream> 对象

C++ 即时启用/禁用 std::couts 的调试消息

c++ - 在函数模板中使用类型参数和指向相同类型参数的指针

c++ - 隐藏模板化辅助函数 - 静态成员或未命名的命名空间