gpt4 book ai didi

c++ - 如何从模板类中的类型名传递创建新的类型名

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:54:38 26 4
gpt4 key购买 nike

假设我有一个模板类

template <class DATA>
class Stack {
//Some implementation
}

在这个堆栈类中,我调用了一个实用程序类,它也是模板。但其处理的数据类型是 UltityDATA 类型。也就是说,如果我们使用以下代码创建类堆栈的对象

 stack<MyData> s

在内部它应该调用 UltityMyData。我不想向客户公开 UltityMyData 结构。我已经编写了将 MyData 转换为 UltityMyData 的实现。只有我的要求是在调用我的库类时如何将 DATA typename 转换为 UtilityDATA typename。


我按照你的建议写了下面的代码

#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 它作为一种新的数据类型而不是模板类型。

最佳答案

您可以根据需要使用一个专门化类型定义的结构

// non specialized type
template<typename T>
struct UtilType {};

// specialization for DATA
template<>
struct UtilType<DATA>
{
typedef UtilityDATA type;
};

// other specialization you might need in the future
template<>
struct UtilType<NewType>
{
typedef UtilityNewType type;
};

然后你可以这样使用这个辅助类

template<typename T>
class Stack
{
// .....
typedef typename UtilType<T>::type dataType; //converts DATA typename to UtilityDATA
// .....
}

关于c++ - 如何从模板类中的类型名传递创建新的类型名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21750248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com