减少C++中无数的模板关键字?
reducing countless template keywords in C++?
我有一个非常简单的代码,如下所示。
template<typename T>
struct cell{
int nr;
T* someInfo;
};
template<typename T>
void doSomething(cell<T> c)
{
cout<<c.nr;
}
我实际上有很多使用单元格的函数,很少使用 T* 模板信息(上面的代码不使用它)。我可以编写我的程序(在 C++98 中)而不以 无数的模板关键字,T*或单元格的东西? 我想减少混乱,写一个 而是类似 C 的C++代码,不熟悉的人很容易阅读 C++。我可以让编译器理解(没有宏)每当它看到cell
时,它 实际上是cell<T>
,它必须在函数上放置一个模板?
如果没有 C++98 解决方案,我更喜欢使用void*
而不是T*
的 C 方式。其余代码没有混乱,但我无法delete c.someInfo
,但只有free(c.someInfo)
.
通过从非模板化基类继承重用代码。
struct cell_base {
int nr;
};
template<typename T>
struct cell : cell_base {
T* someInfo;
};
void doSomething(cell_base const& c)
{
cout<<c.nr;
}
所以任何需要非模板化位的东西都接受cell_base
,而需要模板参数的少数东西可以是模板。
如果要使用模板,则需要使用正确的模板语法。
这确实意味着写T
很多次以及template<typename T>
。这就是生活:编译器做了一些非常聪明的事情,并且需要这个"样板"来消除歧义。
您可以通过在类声明中内联编写所有函数来减少类型量。
改用(void*)
是不合时宜的。
你可以键入你的模板;这将完全隐藏它是特定类型的模板的事实。 即
typedef cell<int> IntCell;
然后类型的用法
void doSomething(const IntCell& c) {}
编辑:我现在意识到你问的是c ++ 98。不幸的是,我的建议需要 c++14。
您可以使用通用 lambda 代替模板函数:
auto doSomething = [](auto c) {
cout<<c.nr;
}
如果你愿意等待一会儿,有关于C++标准的概念提案,希望能包含在C++20中。它包括通用函数,可以允许:
void doSomething(auto c)
{
cout<<c.nr;
}
或
void doSomething(Concept c)
{
cout<<c.nr;
}
Concept
是所有人都满足的概念cell<T>
。这是一个编译时模拟 StoryTeller 建议的运行时继承。
希望有一天这对某人有用,我将解释为什么我最终会得到 C++老派的 C 解决方案。你可能需要和我一样混乱才能理解, 即,您需要处理一些您不想混乱的次要未知指针 一个C++代码,已经有许多类无法在合理的时间内移植到 C 中。 我感谢我收到的所有回复,在考虑了这些回复之后,我很遗憾他们无法解决我的问题。即使有遗产,我最终仍然有数百template
和<T>
东西,因为我有很多带有单元格成员的类和子类。
像在 C 中那样使用void* someInfo
更容易/更干净,因为这不需要修改所有 包含单元格的类。删除void*
指针的问题留给用户 的图书馆。 很容易允许/要求用户进行唯一的调用,例如set_func_free_info(&custom_free_func)
.库的释放函数可以是:
if(func_free_info!=NULL)
func_free_info(c.someInfo);
else //don't let it get here if someInfo points to an object
free(c.someInfo); //needing a destructor, do use set_func_free_info(...).
鉴于一些回应,我觉得你:
- 可能会说
void*
是"不合时宜的"。或。如果有人告诉我,这么古老的语言 就像英语面对现代世界语是不合时宜的,我也会有同样的感觉。 - 可能会说,为不熟悉的纯C程序员编写代码是一个坏主意 使用C++,在上面注释的行中"代码最终比它需要的更复杂 所以即使是那些熟悉C++的人最终也会感到困惑。如果你老实说 想想看,这里正好相反:通过避免C++,代码变得不那么复杂 功能,因为模板构造会使次要功能的所有代码混乱。
- 问为什么不要坚持纯C,简单地完成故事。我不能,因为这是 代码的一部分,其中
someInfo
可以是对象。所以我最终 这里的一些人似乎讨厌的类似C的C++风格,但你真的可以找到理由 链接的材料我上面的评论。
无论如何,M Stroustrup说
C++经过精心设计,可支持各种 风格而不是一种潜在的"一种真正的方式"。
因此,如果您喜欢讲授"您的 真正的C++方式",你应该明白你不应该这样做。 你会看到很多生活 不仅仅是一个愚蠢的游戏。C++支持无限多的样式和可能性 C,例如,我可以在其中回复中使用 lambda,但太多人不会理解它。
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- 对齐和对齐的实际用例C++关键字
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 在 Objective-C++ -> EXC_BAD_ACCESS Error 中使用"new"关键字