2010-04-04 48 views
5

如果两个对象的模板参数在运行时相同,是否有任何方法可以从给定对象构造一个新对象?例如:C++模板类和复制构造

我与声明中的模板类:

template<typename _Type1, typename _Type2> class Object; 

接下来,我有模板的两个示例:

template class Object<char, int>; 
template class Object<wchar_t, wint_t>; 

现在,我想编写一个成员函数,作为:

template<typename _Type1, typename _Type2> 
Object<char, int> Object<_Type1, _Type2>::toCharObject() { 
    if(__gnu_cxx::__are_same<_Type1, char>::__value) 
     return *this; 
    else { 
     //Perform some kind of conversion and return an Object<char, int> 
    } 
} 

我已经尝试了一些技术,如使用__gnu_cxx::__enable_if<__gnu_cxx::__are_same<_Type1, char>::__value, _Type1>::__type在一个拷贝构造函数为Oject类,但我一直运行到错误:

error: conversion from ‘Object<wchar_t, wint_t>’ to non-scalar type ‘Object<char, int>’ requested 

有没有办法,我能做到这一点?任何帮助将不胜感激!

+2

您的模板类型名称无效。下划线后跟大写字母标识符**保留供实施**使用。它们可能与编译器或标准库定义的名称冲突。 – jalf 2010-04-04 16:06:55

+0

@jaif:别担心类型名称。例如,我只是随便挑选它们。我所有的代码实际上都是在不同的命名空间中定义的,所以应该没有冲突。 – themoondothshine 2010-04-04 16:09:45

+3

命名空间不是问题的名称 - 像_Type1在所有情况下都是保留的(例如,它们可能是宏),在这种情况下,不太可能被实现使用。还是你说你发布的内容不是导致你的问题的真正代码?那么,不要那样做。 – 2010-04-04 16:15:10

回答

4

你应该有什么工作,问题是编译器正在对return *this部分进行类型检查,即使类型不相等(因此编译错误)。只需使用return (Object<char, int>)(*this);,你应该没问题 - 代码执行的唯一时间是类型相同的时候,所以除了解决编译错误问题外,其他任何操作都不会做任何事情。

或者,您可以使用模板特:

template <class _Type1, class _Type2> 
Object<char, int> toCharObject(Object<_Type1, _Type2> obj) 
{ 
    // Do conversion and return 
} 

// Specialisation when types are equal 
template <> 
Object<char, int> toCharObject(Object<char, int> obj) 
{ 
    return obj; 
} 

这是你可以看到一个免费的功能。你可以将它作为一个成员函数来完成,但它更棘手,因为你不能专门化单个成员函数 - 你必须专门研究整个类。你可以通过分解非专业代码来解决这个问题,但这真的很难看,而且这也是一样。

+0

@彼得:你已经击中了头部!我应该早就想到模板专业化了......我已经在很多地方使用了它。咄!万分感谢! – themoondothshine 2010-04-04 16:25:31

+0

@彼得:......但不知何故,我无法让演员工作。如果我尝试转换它,编译器会报告“错误:无效转换”。 – themoondothshine 2010-04-04 16:30:56

+0

这是什么工作虽然:'返回对象(* reinterpret_cast <常量对象 *>(this))' – themoondothshine 2010-04-04 16:33:29