C++ C++;——在这种情况下,编译器可以推断类型

C++ C++;——在这种情况下,编译器可以推断类型,c++,C++,谢谢你第一个案例以类模板为特色。第二种情况是函数模板。这是一个区别。第一个案例的特点是类模板。第二种情况是函数模板。这是唯一的区别。很简单:在第一种情况下,没有任何东西可以从中推断模板类型。。。你会怎么做P通常,对于类模板,您需要指定类型,并且(如果我错了,请纠正我)永远无法推断它。 在第二种情况下,编译器可以推断类型,因为您将Widget*类型的对象传递给该操作符()。这就是编译器看到的“啊,传入的Widget*,现在我知道T应该是什么了!” 简单:在第一种情况下,没有任何东西可以从中推断模板

谢谢你

第一个案例以类模板为特色。第二种情况是函数模板。这是一个区别。

第一个案例的特点是类模板。第二种情况是函数模板。这是唯一的区别。

很简单:在第一种情况下,没有任何东西可以从中推断模板类型。。。你会怎么做P通常,对于类模板,您需要指定类型,并且(如果我错了,请纠正我)永远无法推断它。
在第二种情况下,编译器可以推断类型,因为您将
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*) ...