【发布时间】:2017-07-23 17:39:39
【问题描述】:
我曾经是一名 c++ 程序员,并且是 scala 的新手。 而我在 scala 中如何做一些通用编程,例如
class FooComponent
{
public:
static const int ComponentId = 1;
}
class BarComponent
{
public:
static const int ComponentId = 2;
}
template<typename T>
void registerComponent()
{
register(T::ComponentId)
}
但在 scala 中没有类静态变量。我知道有伴生对象,但我不能仅通过类型参数访问伴生对象。
在 scala 中实现类似功能的正确方法是什么?
【问题讨论】:
-
不是c++程序员,不是说
FooComponent继承了模板吗??还有当你做T::ComponentId时,T甚至没有ComponentId?? 你可以忽略我的问题,我不知道 c++ 模板:) -
@prayagupd -
registerComponent<BarComponent>()类型的调用将使用主体register(BarComponent::ComponentId)实例化一个函数。T是此处类型的替代,而不是任何特定类型。 -
@prayagupd 你说得对。它不知道 T 是否有 ComponentId。但是当你尝试实例化一个类型为 T 且没有 ComponentId 的函数时,它会抛出编译错误
-
这看起来很有趣,所以你可以调用其中没有
ComponentId定义的template,它会编译。我的猜测是模板更接近 scala/java/OO 中的接口,您可以在其中预定义实现类中的内容。 -
我的尝试,不完全是c++模板拷贝,更接近scastie.scala-lang.org/prayagupd/s5CPeKhsTs2hkg96fwDGKg/1