我有一个非常简单的代码,如下所示。
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)
&
。
答案 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*
是“不合时宜的”。也许。如果有人告诉我这么老的语言
就像英语对现代世界语来说是不合时宜的,我会有同样的感受。someInfo
可以是一个对象。所以我结束了
有些类似于C的C ++风格,有些人似乎讨厌,但你真的可以找到理由
我上面评论的链接材料。 无论如何,M Stroustrup说
C ++旨在支持各种各样的 风格而非可能是“一种真实的方式”。
所以,如果你想讲一讲“你的 真正的C ++方式“,你应该明白你不应该这样做。你会看到生活如此之多 不仅仅是一个愚蠢的游戏。 C ++支持无限多种样式和可能性 C,例如,我可以在其中一个回复中使用lambdas,但有太多人不理解它。