【发布时间】:2014-02-13 09:36:57
【问题描述】:
假设我有一个模板类
template <class DATA>
class Stack {
//Some implementation
}
在这个堆栈类中,我调用了一个工具类,它也是模板。但其处理的数据类型是 UltityDATA 类型。也就是说,如果我们使用以下代码创建类堆栈的对象
stack<MyData> s
在内部它应该调用 UltityMyData。我不想将 UltityMyData 结构暴露给客户。我已经编写了将 MyData 转换为 UltityMyData 的实现。只有我的要求是当我调用我的库类时如何将 DATA 类型名转换为 UtilityDATA 类型名。
根据您的建议,我已经编写了以下代码
#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>
using namespace std;
struct RTI
{
int a;
};
struct DDSRTI
{
int b;
};
// other specialization you might need in the future
template<class Data>
struct DDS
{
typedef DDSData type;
};
template <class T>
class MyStack {
private:
T a;
public:
MyStack()
{
// cout<< a;
}
};
#define STACK(T) Stack<DDS##T>
template <class T>
class Stack {
private:
Stack<T> a;
STACK(T) b;
public:
Stack()
{
///cout<< a;
}
};
但我收到错误,因为 错误:'DDST' 未在此范围内声明
基本上预处理器只附加两个值并创建一个新类型。根据我的理解,模板将在编译时进行转换。 DDS#T 将其作为一种新的数据类型而不是模板类型。
【问题讨论】:
-
UtilityMyData是否也设计为模板类?如果您出示声明会很有帮助。 -
不,这是不可能的,模板类(在您的情况下为
Stack)不知道用于实例化的实际类型,因此 C++ 语言内部没有办法允许这样做。跨度>