Java 是否有相当于<;?扩展T>&书信电报;?超级T>;在C++;?

Java 是否有相当于<;?扩展T>&书信电报;?超级T>;在C++;?,java,c++,generics,templates,Java,C++,Generics,Templates,第二个问题的答案是否等同于:是的。就泛型而言,接口被视为与实际类相同 我将把第一个问题留给更懂C++的人来回答。它不像Java那样有很好的语法优势,但它具有boost/type\u特性,可以很好地管理。 有关更多信息,请参阅 #include <boost/type_traits.hpp> #include <boost/static_assert.hpp> class Base {}; class Derived_from_Base : public Base {};

第二个问题的答案是否等同于
:是的。就泛型而言,接口被视为与实际类相同


我将把第一个问题留给更懂C++的人来回答。

它不像Java那样有很好的语法优势,但它具有boost/type\u特性,可以很好地管理。 有关更多信息,请参阅

#include <boost/type_traits.hpp>
#include <boost/static_assert.hpp>

class Base {};
class Derived_from_Base : public Base {};
class Not_derived_from_Base {};

template<typename BASE, typename DERIVED>
void workOnBase()
{
    BOOST_STATIC_ASSERT((boost::is_base_of<BASE, DERIVED>::value)); 
}

int main()
{
    workOnBase<Base, Derived_from_Base>();     // OK
    workOnBase<Base, Not_derived_from_Base>(); // FAIL
    return 0;
}
#包括
#包括
类基{};
从_基派生的类:公共基{};
类不是从基{}派生的;
模板
void workenbase()
{
BOOST_STATIC_ASSERT((BOOST::is_base_of::value));
}
int main()
{
worknbase();//好的
workenbase();//失败
返回0;
}
1> d:…\main.cpp(11):错误C2027:使用未定义的类型“boost::STATIC\u ASSERTION\u FAILURE” 1> 与 1> [ 1> x=假
1>

,可以使用各种特性机制限制C++中模板参数的范围,其中在Boosi.

中有可用的实现方式。 通常情况下,您不会这样做——Java和C中存在语法的原因是它们使用泛型,而不是模板

Java泛型生成共享代码,该代码使用来自基类型的虚拟分派,而不是为用作模板参数的每个类型生成代码。因此,通常使用限制是为了允许对用作模板参数的类型的对象调用方法

为C++生成每个模板类型的代码,不需要知道它们的基类型。

例如,矩阵的模板类将在其目标类型上使用+、-、*运算符。In可以用于支持这些运算符的任何类型。如果任意将其限制为
double
s和
int
s,则不能将模板与
complex
一起使用,也不能使用支持区间算术的类型运行测试,即使这些类型提供了这些运算符,并且矩阵库使用它们也是有效的

模板的强大之处在于能够处理具有相同形状的任意类型,并使它们更加有用。由客户机代码决定将该模板与该类型一起使用是否有效(只要该模板已编译),客户始终是正确的。泛型的一个弱点是无法处理具有相同形状的任意类型,并且需要指定调用方法的限制,而不是
java.lang.Object
的方法

遗憾的是,这是一个从C++0x标准草案中删除的问题,因为它“还没有准备好”。但是,可以使用静态断言(这是人们在这里提到的C++0x和Boost的一部分)来模拟这种情况。

这对我来说很有效:

#include <iostream>

class MyBase {}; 
class A : public MyBase {};    
class B {};

template <class T>
typename std::enable_if<!std::is_base_of<MyBase, T>::value>::type
Foo(T &v) {
    std::cout << "Foo 1" << std::endl;
}

template <class T>
typename std::enable_if<std::is_base_of<MyBase, T>::value>::type
Foo(T &v) {
    std::cout << "Foo 2" << std::endl;
}

int main() {
  A a;
  B b;
  Foo(a);
  Foo(b);
  return 0;
}
#包括
类MyBase{};
A类:公共MyBase{};
B类{};
模板
typename std::enable_if::value>::type
傅(T&v){

std::这个问题早于
的基础吗(如果
是这样的话,
启用),今天这应该是第一部分的默认解决方案回答:JesperE对第二部分有正确的答案。你需要它做什么?可能有一个比试图模拟Java特性更简单、更像C++的解决方案