Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找派生模板类型_C++_Templates - Fatal编程技术网

C++ 查找派生模板类型

C++ 查找派生模板类型,c++,templates,C++,Templates,我从非模板基派生了一个模板类 struct CBaseList { virtual size_t Size() = 0; }; template <class T> struct CPointList : public BaseList { virtual size_t Size() { return mData.size(); } std::vector <T> mData; }; // Ok, now I can create various ins

我从非模板基派生了一个模板类

struct CBaseList {
  virtual size_t Size() = 0;
};

template <class T>
struct CPointList : public BaseList { 
  virtual size_t Size() { return mData.size(); }
  std::vector <T> mData;
};

// Ok, now I can create various instances
CBaseList * lst1 = new CPointList<float> ();
CBaseList * lst2 = new CPointList<double> ();
struct CBaseList{
虚拟大小\u t size()=0;
};
模板
结构CPointList:公共基列表{
虚拟大小\u t size(){return mData.size();}
std::向量mData;
};
//好的,现在我可以创建各种实例了
CBaseList*lst1=新的CPointList();
CBaseList*lst2=新的CPointList();
但如何在不同实例之间复制/分配值?比如说

template <class T1, class T2>
void CopyVec( const T1 & src, T2 & dst )
{
  dst.resize(src.size());
  for (size_t i = 0; i < src.size(); ++i)
   dst[i] = src[i];    
}

void CopyList( const CBaseList * src, CBaseList * dst )
{
 // How to call CopyVec ?
}
模板
无效复制向量(常数T1和src、T2和dst)
{
resize(src.size());
对于(size_t i=0;i
如果我将CBaseList强制转换到任何派生类,那么我就有了一个丑陋的“开关”。有更好的解决方案吗

谢谢 伊戈尔


蒂顿

谢谢你的回复。我意识到任何编译器都应该看到/拥有从模板生成代码的类型——没有其他方法。但是如何一次紧凑地实现它,而不复制任何所需的模板函数呢?我在想一幅素描,比如:

// caller
theWrapper(lst1, lst2)->mInstance().DoCopy(lst1, lst2, num);

// mInstance type
template <class T1, class T2>
struct CWrapInstance {
 void DoCopy( CBaseList * lst1, CBaseList * lst2, size_t num ) 
 {
  // cast types and call original template
  Copy(((T1 *) lst1)->mData, ((T2 *) lst2)->mData, num); 
 }
}; 
//调用者
包装器(lst1,lst2)->minInstance().DoCopy(lst1,lst2,num);
//敏度型
模板
结构CWrapInstance{
作废文件副本(CBaseList*lst1,CBaseList*lst2,大小\u t num)
{
//转换类型并调用原始模板
复制(((T1*)lst1)->mData,((T2*)lst2)->mData,num);
}
}; 
因此,对于每个新模板,我只需要向CWrapInstance添加一个小方法。但是如何设计“包装器”

谢谢你的理解。
在C++中,Igor < /P> < P>在运行时,没有办法传递<强>类型<强>。类型不是第一类对象,类型只在编译时存在

您可以做的是传递type名称(例如,
typeid
,或者您可以创建自己的枚举,并向容器中添加一个返回此枚举值的虚拟方法)

机器代码,例如从代码>双/<代码>到代码>浮点< /代码>与机器代码有明显的区别,机器代码从“代码> int <代码>转换为<代码>未签名的长long < /代码>,请记住C++程序在运行时不能创建新代码,运行时可能需要的所有机器代码必须在编译时创建

这意味着,如果需要创建多态数据容器(意味着运行时多态性),并且希望在实例之间提供转换/赋值,则必须在编译时提前创建所有可能转换组合的代码,并且还必须使用类型名选择要运行的代码

所以是的。不幸的是,你需要一个开关或类似的东西

开关的一个可能替代方法是创建转换函数的映射。。。e、 g

std::map< std::pair<int, int>, void (*)(CBaseList *, CBaseList *) > converters;

我不认为你可以避免光荣的开关,6502张贴了一个很好的替代执行它。问题是,您的类型没有任何形式上的关联,因此您实际上需要n^2个转换函数,这些函数需要从模板实例化,而这不能在运行时完成。我推荐一种不同的设计

template<typename U, typename V>
void assign(CBaseList *u, CBaseList *v)
{
    CPointList<U>* pu = dynamic_cast< CPointList<U> >(u);
    CPointList<V>* pv = dynamic_cast< CPointList<V> >(v);
    ...
}

void init_converters()
{
    converters[std::make_pair(FLOAT_ID, DOUBLE_ID)] = &assign<float, double>;
    converters[std::make_pair(INT_ID, DOUBLE_ID)] = &assign<int, double>;
    ...
}
converters[std::make_pair(a->id(), b->id())](a, b);