【问题标题】:How to create instances of other classes using a templated class?如何使用模板类创建其他类的实例?
【发布时间】:2020-06-14 00:03:48
【问题描述】:

我正在尝试使用模板,想知道是否有可能实现这样的目标:

template<typename T> class TemplatedClass{

private:
    T n;
    T z;
    T x;


public:

    TemplatedClass(T n, T z, T x) {
        this->n= n;
        this->z= z;
        this->x= x;
    }

此模板类将使用其构造函数根据给定数据创建自身的实例,例如:

struct Mystruct{
    string n;
    int x;
    float d;

};


void TemplatedClass<T>::createInstances(T o){
   TemplatedClass<Mystruct> tc(o.getS(), sizeof(o), 16.2f);
}
//Where (T o) is any other class that contains some function that returns a string.

这甚至可能吗?根据我的研究,我发现它可以与使用可变参数模板的 C++11 一起使用 但不完全确定如何实现它。

我正在尝试根据结构中的任何数据成员(在这种情况下,它的字符串、int 和浮点数)创建该模板化类的实例,并且我们从其他类获取数据只要因为它们与结构匹配。

非常感谢任何帮助!

【问题讨论】:

  • TemplatedClass&lt;Mystruct&gt; 有三个Mystruct 类型的成员,它的构造函数接受三个Mystruct 类型的参数。不是stringintfloat。目前尚不清楚您要达到的目标。
  • 确实非常非常非常不清楚
  • 我正在尝试根据结构中的数据成员(在这种情况下,它的字符串、整数和浮点数)创建该模板化类的实例,并且我们正在获取数据来自其他类,只要它们与结构匹配。
  • 好吧,它们都必须具有 MyStruct 类型,不是吗?您是否尝试使用相同的参数为 n、x 和 z 提供参数并实例化三个不同的副本?
  • 有什么意义?你会用TemplatedClass&lt;Mystruct&gt; 做什么,你不能直接使用Mystruct?不要描述你提出的解决方案,而是描述你试图解决的原始问题。

标签: c++ c++11 templates variadic-templates


【解决方案1】:

如果我理解正确(我不确定我是否正确),那么您可以这样做:

#include <iostream>
#include <string>
#include <typeinfo>

template<typename T1, typename T2, typename T3> class TemplatedClass
{
private:
    T1 n;
    T2 z;
    T3 x;
};

struct Mystruct
{
    std::string n;
    int x;
    float d;
};

int main ()
{
    auto tc = TemplatedClass <decltype (std::declval <Mystruct> ().n),
                              decltype (std::declval <Mystruct> ().x),
                              decltype (std::declval <Mystruct> ().d)> {};
    std::cout << typeid (tc).name ();
}

输出:

14TemplatedClassINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEifE

但是模板类中数据成员的数量必须固定。

Live demo

【讨论】:

  • 感谢您的回答!使用该模板类中的构造函数是否可以做到这一点?
  • 对不起,我不明白。也许您可以为您的问题添加一个示例,说明您正在尝试做什么。但是,如果这就是您的意思,那么模板化类没有任何理由不应该有构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
相关资源
最近更新 更多