有相当于,在C ++中?
-
有相当于
,
在C ++中?
-
还有
,
即使
T
是Java中的接口,工作?
回答第一部分: 限制模板function
JesperE的第二部分答案正确。
它没有像Java那样很好的语法糖,但它可以通过boost / type_traits很好地管理。 有关详细信息,请参阅http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/index.html 。
#include #include class Base {}; class Derived_from_Base : public Base {}; class Not_derived_from_Base {}; template void workOnBase() { BOOST_STATIC_ASSERT((boost::is_base_of ::value)); } int main() { workOnBase (); // OK workOnBase (); // FAIL return 0; }
1> d:… \ main.cpp(11):错误C2027:使用未定义类型’boost :: STATIC_ASSERTION_FAILURE’1> 1> [1> x = false 1>]
回答你的第二个问题:是的。 就generics而言,接口被视为与真实类相同。
我将把第一个问题留给更多精通C ++的人。
您可以使用各种特征机制限制C ++中模板参数的范围,其中有一些实现可用于boost。
通常你不这样做 – Java和C#中存在语法的原因是它们使用generics而不是模板。
Javagenerics生成共享代码,该代码使用基类型的虚拟分派,而不是为用作模板参数的每种类型生成代码。 因此,通常使用限制是为了允许您在用作模板参数的类型的对象上调用方法。
由于C ++为用作模板参数的每种类型生成代码,因此不需要知道它们的基本类型。
例如,矩阵的模板类将在其目标类型上使用+, – ,*运算符。 然后可以将其用于支持这些运算符的任何类型。 如果它被任意限制为double
s和int
s,那么你就不能使用带有complex
的模板或运行支持区间运算的类型的测试,即使这些类型提供了那些运算符和矩阵库使用它们是有效的。
处理具有相同形状的任意类型的能力是模板的强大function,并使它们更有用。 由客户端代码决定是否有效使用该类型的模板(只要它编译),并且客户始终是正确的。 无法处理具有相同形状的任意类型,并且需要指定调用除java.lang.Object
以外的方法的限制是generics的弱点。
这是一个遗憾,从C ++ 0x草案标准中删除,因为它“尚未准备好”。 但是,可以使用静态断言来模拟这个(这是人们在这里提到的C ++ 0x和Boost的一部分)。
这对我有用:
#include class MyBase {}; class A : public MyBase {}; class B {}; template typename std::enable_if::value>::type Foo(T &v) { std::cout << "Foo 1" << std::endl; } template typename std::enable_if::value>::type Foo(T &v) { std::cout << "Foo 2" << std::endl; } int main() { A a; B b; Foo(a); Foo(b); return 0; }