减少C++中无数的模板关键字?

reducing countless template keywords in C++?

本文关键字:关键字 C++ 减少      更新时间:2023-10-16

我有一个非常简单的代码,如下所示。

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,但太多人不会理解它。