C++ C++;——在这种情况下,编译器可以推断类型
谢谢你第一个案例以类模板为特色。第二种情况是函数模板。这是一个区别。第一个案例的特点是类模板。第二种情况是函数模板。这是唯一的区别。很简单:在第一种情况下,没有任何东西可以从中推断模板类型。。。你会怎么做P通常,对于类模板,您需要指定类型,并且(如果我错了,请纠正我)永远无法推断它。C++ C++;——在这种情况下,编译器可以推断类型,c++,C++,谢谢你第一个案例以类模板为特色。第二种情况是函数模板。这是一个区别。第一个案例的特点是类模板。第二种情况是函数模板。这是唯一的区别。很简单:在第一种情况下,没有任何东西可以从中推断模板类型。。。你会怎么做P通常,对于类模板,您需要指定类型,并且(如果我错了,请纠正我)永远无法推断它。 在第二种情况下,编译器可以推断类型,因为您将Widget*类型的对象传递给该操作符()。这就是编译器看到的“啊,传入的Widget*,现在我知道T应该是什么了!” 简单:在第一种情况下,没有任何东西可以从中推断模板
在第二种情况下,编译器可以推断类型,因为您将
Widget*
类型的对象传递给该操作符()
。这就是编译器看到的“啊,传入的Widget*
,现在我知道T应该是什么了!”
简单:在第一种情况下,没有任何东西可以从中推断模板类型。。。你会怎么做P通常,对于类模板,您需要指定类型,并且(如果我错了,请纠正我)永远无法推断它。
在第二种情况下,编译器可以推断类型,因为您将
Widget*
类型的对象传递给该操作符()
。这就是编译器看到的“啊,传入的Widget*
,现在我知道T应该是什么了!”
在案例II中,有时
operator()
被称为静态多态。
正如您所提到的,在许多情况下,case II可能比编译器更方便
可以推断参数类型。
然而,在当前C++中,多态性<>代码>操作程序()/<代码>不适用。
例如,如果运算符()
具有签名:
// Call:
DeleteObject deleter;
Widget* mypwidget;
deleter(mypwidget);
// ^^^^^^^^^ -- of type `Widget*`, so `T` can be substituted with `Widget*`
struct DeleteObjectB{
模板
T运算符()(常数T*)。。。
那么我们就不能将这个DeleteObjectB
传递给像std::bind1st
这样的活页夹,
boost::bind
或类似的。
这些活页夹需要嵌套的typedef
result\u type
作为结果
运算符()的类型
。
所以,在本例中,我们需要案例一。在案例二中,有时
操作符()
被称为静态多态。
正如您所提到的,在许多情况下,case II可能比编译器更方便
可以推断参数类型。
然而,在当前C++中,多态性<>代码>操作程序()/<代码>不适用。
例如,如果运算符()
具有签名:
// Call:
DeleteObject deleter;
Widget* mypwidget;
deleter(mypwidget);
// ^^^^^^^^^ -- of type `Widget*`, so `T` can be substituted with `Widget*`
struct DeleteObjectB{
模板
T运算符()(常数T*)。。。
那么我们就不能将这个DeleteObjectB
传递给像std::bind1st
这样的活页夹,
boost::bind
或类似的。
这些活页夹需要嵌套的typedef
result\u type
作为结果
运算符()的类型
。
因此,在这种情况下,我们需要案例一。@Oli,我可以这样说吗。无论何时我们在类模板中,我们都应该提供类型;无论何时我们在函数模板中,我们都不应该提供类型。@Johannes:类模板参数不是派生的。这不对吗?@Johannes:但它的构造函数是函数(模板)。第二种情况是函子类。@Johannes:“第二种情况”以函数模板为特征。而不是“
DeleteObjectB
是函数模板”@Oli,我可以这样说吗。无论何时我们在类模板中,我们都应该提供类型;无论何时我们在函数模板中,我们都不应该提供类型。@Johannes:类模板参数不是派生的。这不对吗?@Johannes:但它的构造函数是函数(模板)。第二种情况是functor类。@Johannes:“第二种情况”以函数模板为特征。而不是“DeleteObjectB
是函数模板”。相关问题是。您可能也想快速查看一下。相关问题是。您可能也想快速查看一下。
// Call:
DeleteObject deleter;
Widget* mypwidget;
deleter(mypwidget);
// ^^^^^^^^^ -- of type `Widget*`, so `T` can be substituted with `Widget*`
struct DeleteObjectB {
template<typename T>
T operator() (const T*) ...