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

避免在默认模板中使用尖括号

汝天宇
2023-03-14

如果我有一个默认模板类型的模板类,我必须编写模板尖括号。有没有可能避免这种情况?

示例:

template <typename T=int>
class tt {
public:
  T get() { return 5; }
};

...

tt<> t;  // how to avoid <>
std::cout << t.get() << std::endl;

到目前为止,我都是通过一个单独的名称空间和重新定义类来实现这一点的:

namespace detail_ {
template <typename T=int>
class tt {
public:
  T get() { return 5; }
};
}

class tt : public detail_::tt {}

...

tt t;
std::cout << t.get() << std::endl;

问题是,如果我想将类与其他类型一起使用,我必须检查名称空间detail_。有没有另一种解决方案,我还没有看到。

共有3个答案

拓拔俊德
2023-03-14

自C17以来,由于类模板参数的推导,情况发生了变化。

tttt

无论如何,在像您的示例中这样的简单场景中,C17假设您的意思和

进一步详情:

  • 模板默认参数(特别是https://stackoverflow.com/a/50970942/3235496);

齐鹏程
2023-03-14

你可以使用typedef...

typedef tt<> tt_;

然后简单地使用tt\uu

吕文林
2023-03-14

... 如果我想使用这个类。。。

这是一个常见的混淆来源。类模板不是类,而是生成类的模板。角括号告诉编译器,你想要用给定的模板参数从类模板中生成一个类,没有角括号,你所拥有的就是一个模板。

template <typename T = int>
struct TemplateClass { /*...*/ };

template <template <typename>  class T>
void f() {
   T<int> t; // ...
}
template <typename T>
void g() {
   T t; // ...
}

f<TemplateClass>();     // Accepts a template with a single type argument
g<TemplateClass<> >();  // Accepts a type, that can be generated out of the template

该语言不允许在同一名称空间中同时存在具有相同名称的模板和类型,因此答案是不能这样做。您可以创建类型别名,但必须为其指定不同的名称。

 类似资料:
  • Lambda表达式是C++编程中的游戏规则改变者。这有点令人惊讶,因为它没有给语言带来新的表达能力。Lambda可以做的所有事情都可以通过其他方式完成。但是lambda是创建函数对象相当便捷的一种方法,对于日常的C++开发影响是巨大的。没有lambda时,标准库中的_if算法(比如,std::find_if, std::remove_if, std::count_if等)通常需要繁琐的谓词,但是当

  • 问题内容: 有什么方法可以使JAXB不保存其值是@Element批注中指定的默认值的字段,然后在从XML加载null或空值的元素时对其设置值?一个例子: 应生成: 而当加载 我正在尝试执行此操作,以生成干净的XML配置文件,并使其可读性更强且尺寸更小。 敬请谅解,谢谢。 问题答案: 您可以通过在get / set方法中使用逻辑并将逻辑放入其中来执行以下操作: 例 演示版 输出量 想要查询更多的信息

  • 问题内容: 我正在调用一些JSON并将相关数据解析为CSV。我无法弄清楚如何使用默认密钥填充中间的JSON dict文件,因为其中很多是未填充的。当我尝试将内容解析为CSV时,结果为KeyError。 我现在收到(制造商)的“ NoneType”错误: 问题答案: 您可以使用而不是直接引用键。

  • 我的班级结构如下: 所有的getter和setter都已定义。我使用Java反射进行如下调用: 现在,在调用它之前,我只设置了,而没有设置。我将这个ClassAObj转换成JSON,发现的默认值设置为,它出现在JSON中。我不希望JSON中出现字段。我该如何避免这种情况? 有趣的是,如果我设置了而不是,那么标签不会出现在JSON中。

  • 问题内容: python的新手,新手开发人员,首次调用 我正在调用一些JSON并将相关数据解析为csv。我无法弄清楚如何使用默认键填充中间的json Dict文件,因为其中很多都没有填充。当我尝试将内容解析为csv时,结果是KeyError。希望有任何建议! 谢谢。 更新:谢谢大家!我现在收到(制造商)的“ NoneType”错误: 问题答案: 您可以使用而不是直接引用键。

  • 如果允许我执行以下操作: 为什么我主要不被允许做以下事情? 但我必须具体说明以下几点: C11引入了默认的模板参数,现在我完全无法理解它们。