未指定的绑定

时间:2011-10-28 22:08:37

标签: c++ bind msdn unspecified

我正在MSDN上研究std::bind是什么以及它的用途(最终可能是一个不同的问题):http://msdn.microsoft.com/en-us/library/bb982702.aspx

并且看到列出的原型是:

template<class Fty, class T1, class T2, ..., class TN>
   unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);
template<class Ret, class Fty, class T1, class T2, ..., class TN>
   unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);

这让我感到困惑有两个原因。 1)最后我检查过,MSVC没有实现可变参数模板,2)我的问题:unspecified这个词是什么意思? (它似乎与未指明的行为有关。)

3 个答案:

答案 0 :(得分:1)

返回类型中的未指定的表示它是一种未指定的类型。只要返回的类型符合标准规定的要求,标准就不需要从bind返回特定类型。

...开始,我不知道VS是否实现了它们,但是你会看到boost::bind的相同文档,并且它已在不同的编译器中编译而没有可变参数模板支持已经有一段时间......文档说明你可以传递不同类型的N个参数,但这并不一定意味着有一个模板可以做到这一点,它可以用一组来实现1-ary,2-ary ... N-ary模板。

文档显示了您可以使用它的行为,而不是它的实现细节。

答案 1 :(得分:1)

有单独的重载需要{1,2,..., N }参数。文档不是全部列出,而是使用简写来表明您可以使用各种数量的参数。它并不意味着说明有效的C ++语法。我希望文档中提到 N 是什么。

结果类型取决于传入的参数。它将是某种形式的仿函数,并且该仿函数通常可存储在function对象中,或者您可以将结果直接传递给{{1并让编译器的模板类型推导出来。只要结果是可调用的,实际类型并不重要,并且在文档中尝试简要解释会很复杂。

答案 2 :(得分:1)

Visual Studio不实现可变参数模板。他们通过基本上具有很多函数重载(可能是通过宏构建)来模拟这个概念。这就是boost::bind的实施方式,即std::bind的来源。

unspecified的{​​{1}}返回类型就是这样。它必须是可移动类型的物体。该对象将重载std::bind,以便可以调用operator()绑定的函数。