【问题标题】:How to pass this type auto function?如何传递这种类型的自动功能?
【发布时间】:2015-10-22 01:06:49
【问题描述】:

我正在尝试将此自动函数传递给另一个函数,但显然我无法传递自动类型,所以我可以将其更改为实际的任何类型以传递它吗?通过谷歌搜索,我了解到您可以使用模板,但我们还没有在课堂上讨论它们,所以如果有的话,我宁愿找到一种更初学者的方法。

std::uniform_int_distribution<int> yPosition(lowBounds, 23);    
auto randY = std::bind(yPosition, std::ref(engine));

void my_function(??? randY)
{
}

【问题讨论】:

    标签: c++ c++11 parameter-passing auto


    【解决方案1】:

    来自std::bind

    template <class F, class... Args>
    /*unspecified*/ bind( F&& f, Args&&... args );

    您要查找的类型未指定。当然,它是一个实际的类型,但它是您的标准库选择的任何内容,而不是您可以便携式拼写出来的东西。即使你可以,它也可能是一堆可怕的嵌套元模板,你不会想要拼出来。
    谢谢auto

    您唯一的解决方案是将my_function 设为模板:

    template <class RandY>
    void my_function(RandY &&randY) {...}
    

    【讨论】:

    • 感谢您的澄清
    【解决方案2】:

    传递自动类型的方式使用模板。没有其他选择†

    template <typename F>
    void my_function(F randY)
    { ... }
    


    †​​从技术上讲,概念中有一个提议允许my_function(auto randY),但这只是一个提议。

    【讨论】:

    • 但是这种情况下的自动类型是什么?我不能把它改成它实际上是什么类型吗?我是在网上用 auto 找到的,所以我不知道 auto 是用什么代替的。
    • @AustinMW 你不知道实际是什么类型。见Quentin's answer
    • 啊,好吧,我还以为有一种我不知道的特定类型。
    • 有一种你不应该知道或关心的特定类型。正如 Quentin 上面所说,该类型是“嵌套元模板的可怕混乱”,但它仍然是一种特定类型。您可以找出确切的类型(通过 typeof 或使用 IDE),并且可以将其写下来,但这很少是正确的做法。
    【解决方案3】:

    正如其他答案所述,如果您希望函数采用与绑定完全相同的类型,则需要使用模板。

    但是,如果您只想调用my_function 内的绑定函数,您可以使用std::function&lt;&gt;std::function 使用 type-erasure 来抽象出完整的类型,从而为您提供一种通用的方式来调用您放入其中的任何类似函数的类型。当然std::function 会产生(小)运行时开销。

    void my_function(std::function<int()> randY) { 
       //... 
       int y = randY();
       //...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-03
      • 2019-09-30
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      相关资源
      最近更新 更多