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

时间:2018-01-17 10:10:53

标签: c++ templates

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

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) &

5 个答案:

答案 0 :(得分:4)

通过从非模板化基类继承来重用代码。

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,并且需要模板参数的一些事情可以是模板。

答案 1 :(得分:2)

如果您想使用模板,则需要使用正确的模板语法。

这确实意味着写T几次以及template<typename T>。这就是生活:编译器做了一些非常聪明的事情,需要这个“样板”才能消除歧义。

您可以通过在类声明中内联编写所有函数来减少键入量。

使用(void*)代替将是不合时宜的。

答案 2 :(得分:1)

您可以输入您的模板;这将完全隐藏它作为特定类型的模板的事实。即

"lib": ["dom","es2016","es2017.object"],

然后使用类型

typedef cell<int> IntCell;

答案 3 :(得分:0)

编辑:我现在意识到你问过c ++ 98。不幸的是,我的建议需要c ++ 14。

您可以使用通用lambda代替模板函数:

auto doSomething = [](auto c) {
    cout<<c.nr;
}

如果您愿意等待一点,那么C ++标准的concepts提案将有希望包含在C ++ 20中。它包括可以允许的通用函数:

void doSomething(auto c)
{
    cout<<c.nr;
}

或者

void doSomething(Concept c)
{
    cout<<c.nr;
}

其中Concept是所有cell<T>满足的概念。这是一个类似于StoryTeller建议的运行时继承的编译时间。

答案 4 :(得分:0)

希望有一天这对某些人有用,我会解释为什么我最终得到了 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,例如,我可以在其中一个回复中使用lambdas,但有太多人不理解它。