【问题标题】:std::function type and template instantiationstd::function 类型和模板实例化
【发布时间】:2015-08-31 07:28:51
【问题描述】:

我是 C++ 新手,我正在学习 lambda、函子和可调用对象,我知道有一个包装类,即 std::function,它允许存储和调用不同类型的可调用对象(只要具有相同的调用签名或函数类型)。

现在,我知道您可以使用函数类型参数的函数,这些函数实际上只是函数指针参数,如下所示:

void fun(int,int*(int,int&));

这只不过是一个函数,它接受一个 int 和一个函数指针,指向像 int *f(int,int&) 这样的函数,即使语言允许我将函数作为参数传递(带或不带 & 号)。事实上,函数参数列表也可以写成:

void fun(int,int*(*)(int,int&));

现在,回到std::function 类型

我知道我可以使用函数类型实例化std::function,并且允许将任何类型的可调用对象传递给包装器。但是,函数类型不是我可以在任何实例化中用作模板类型参数的类型,例如:

std::vector<int(int)> f_vec;

相反,我应该创建一个函数指针向量

std::vector<int(*)(int)> f_vec;

这将允许我插入指向函数的指针,但不能插入函子或 lambdas。

所以,我的问题是,我怎样才能实例化一个带有类型参数的模板,比如函数类型?库std::function type.I 的意思是函数类型在我看来是我不能在模板中使用的类型?请你能把事情说得更清楚一点,因为我刚刚开始学习这些主题。谢谢

【问题讨论】:

标签: c++ templates c++11 lambda std-function


【解决方案1】:

你不能写std::vector&lt;int(int)&gt; 的原因并不是关于使用函数类型作为模板参数的基本问题。这是完全有效的。这正是std::vector&lt;T&gt; 所做的 与T (如按值操作),这使得std::vector&lt;int(int)&gt; 非法。

这可以是shown,在没有任何不良情况发生的情况下使用std::vector&lt;int(int)&gt;,例如:

typedef std::vector<int(int)> StillOk;
StillOk *p = nullptr;

只要模板实际上没有尝试使用int(int) 做任何非法的事情,就可以。

因此,只要您的模板以对函数类型合法的方式处理其模板参数,您就可以将它与函数类型一起使用。这是一个假设的例子:

template <class T>
struct MyPointer
{
  T *p;
  T& operator* () const { return *p; }
};

现在实例化MyPointer&lt;int(int)&gt; 并使用它的operator * 是完全合法的,因为它只会涉及int (*)(int) 和int (&amp;)(int) 类型的表达式。 [Live example]

这几乎也是std::function&lt;T&gt; 对其T 所做的事情——仅对函数类型合法的事情。

【讨论】:

  • 好的,所以我知道这个话题确实更深入,我需要深入研究它“一点点”......但现在你让我感到困惑,我知道函数指针,但是函数参考资料??
  • @Luca 是的,函数引用也存在。 void (&amp;alias)() = foo; 完全有效。
  • 它们有什么用?我的意思是,如果我定义一个函数类型的函数参数,它会自动被视为函数指针,那么函数引用如何适应图片?
  • @Luca 问题反过来了——禁止他们会得到什么(除了复杂的编译器)?
  • 是的,但在我看来这两种类型的用法有重叠?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2013-05-05
  • 1970-01-01
相关资源
最近更新 更多