当前位置: 首页 > 知识库问答 >
问题:

如何从模板类中的typename传递创建新的typename

龙永思
2023-03-14

假设我有一个模板类

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

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

 stack<MyData> s

在内部,它应该称为UltityMata。我不想向客户透露UltityMyData结构。我已经编写了将MyData转换为UltityMyData的实现。我唯一的要求是在调用库类时如何将数据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是一种新的数据类型,而不是模板类型。

共有3个答案

田翰林
2023-03-14

也许你可以把它移到一些内部模板结构上?

template <class DATA>
class Stack {
  public:   
    template <class Data>
      struct UtilData {
        template <class... Args>
          UtilData(Args&&... args) : d{std::forward<From>(args)...} {}
            // other operators
          Data d;
        };

    void push(DATA&& d) {
      s.push(UtilData<DATA>{d});
    }
  std::stack<UtilData<DATA>> s;
};

更新:对不起,我误解了你的问题。对于某些具体类型的MyData和UtilMyData,可以使用boost::mpl::map:

using boost::mpl::pair;
using boost::mpl::map;
using boost::mpl::at;

typedef map<pair<SomeOther, Some>/*, other pairs of types here*/> TypeMap;

at<TypeMap, SomeOther>::type s; // s has type Some
裴翰学
2023-03-14

您可以使用traits模式:

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

然后像这样举例:

stack<MyData, UtilityMyData> s;

但是,这需要用户显式地命名实用程序类。如果你不介意使用预处理器,你可以使用宏:

#define STACK(T) Stack<T, Utility##T>

然后你会写:

  STACK(MyData) s;

这并不漂亮,但用户可能会接受

国景铄
2023-03-14

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

// 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;
};

然后,您就可以这样使用这个helper类了

template<typename T>
class Stack
{
    // .....
    typedef typename UtilType<T>::type dataType; //converts DATA typename to UtilityDATA
    // .....
}
 类似资料:
  • 我试图从一组可变的模板类(其中每个类都有一个非类型参数)中恢复非typename模板参数,以便在另一种类型中将它们用作整数序列。 下面的代码显示了我所拥有的。整数序列/成员序列是从元组中抄袭出来的。 和的类型是

  • 我有以下场景,需要一些建议: 用户将输入一个word文档作为模板,并在运行时提供一些参数,这样我就可以查询我的数据库并获得填充文档的数据。所以,我需要做两件基本的事情: null

  • 问题内容: 如何用Java编写等效的代码? 问题答案: 您可能还希望将类本身公开,但这实际上是将字面量转换为Java。 C ++模板和Java泛型之间还有其他区别,但是对于您的示例,这些都不是问题。

  • 了解如何从现有文档创建 Dreamweaver 模板、使用“资源”面板来创建一个新模板或创建 Contribute 站点的模板。 可以基于现有文档(如 HTML)创建模板,也可以从新文档创建模板。 创建模板后,可以插入模板区域,并为代码颜色和模板区域高亮颜色设置模板的首选参数。 注意:您可以在模板的“设计备注”文件中存储关于模板的附加信息(如创作者、上一次更改的时间或做出某些布局决定的原因)。基于

  • 我创建了一个出价模型,以便类型2用户可以在类型1用户创建的一些“帖子”上出价。为了实现这一点,我在模型“出价”中为帖子字段做了一个外键。 实际上,我想把出价与一个特定的帖子联系起来,在“帖子”模型中自动生成“id”。因此,我将get_absolute_url放在我的模板中的Post'id'旁边。我是django的新手,我不确定它是否能满足我的需求。 我如何将带有post_id的出价与模板中的某个特

  • 问题内容: 我的应用程序调用了一个返回字典的API。我想将信息从此字典传递给视图中的JavaScript。具体来说,我在JS中使用Google Maps API,因此我希望向其传递包含长/短信息的元组列表。我知道会将这些变量传递给视图,以便可以在HTML中使用它们,但是如何将它们传递给模板中的JavaScript? 问题答案: 将几乎所有Python对象都转换为JavaScript对象的理想方法是