【问题标题】:std::function and function type deduced by "using" don't have same typestd::function 和 "using" 推导出的函数类型不具有相同的类型
【发布时间】:2019-02-21 09:43:56
【问题描述】:

这里用一个小例子来说明两种不同的函数类型的区别:

#include <iostream>
#include <functional>
#include <type_traits>

template <typename T>
using BinaryOperator = T(const T&, const T&);

int main() {

    std::cout << std::boolalpha 
              << std::is_same<
                      std::function<int(const int&, const int&)>, 
                      BinaryOperator<int>
                 >::value 
              << std::endl;

    return 0;
}

这打印出false,这让我很困惑。这两种类型似乎是等价的。它们有何不同?

【问题讨论】:

  • std::function 是一个模板类,重载了operator (),它不是一个函数
  • template &lt;typename T&gt; using BinaryOperator = std::function&lt;T(const T&amp;, const T&amp;)&gt;; 也一样。

标签: c++ templates template-meta-programming std-function type-deduction


【解决方案1】:

这两种类型似乎是等价的。它们有何不同?

嗯...不:它们是不同的类型。

如果你看std::function's page in cppreference.com,你可以看到std::function是一个部分特化的类(只定义了特化),声明如下

template <class>
class function; // undefined

template <class R, class... Args>
class function<R(Args...)>;

所以你的BynaryOperator&lt;int&gt; 不等同于std::function&lt;int(const int&amp;, const int&amp;)&gt;,但等同于它的模板参数。

可以看到是true

std::is_same<std::function<int(const int&, const int&)>, 
             std::function<BinaryOperator<int>>
>::value //  ^^^^^^^^^^^^^^...................^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    相关资源
    最近更新 更多