我想实现一个接收std :: bind相同参数然后调用它的函数,怎么做?

时间:2016-12-22 07:04:53

标签: c++

我想要实现的很简单,就像:

    addExecutable(helloWorld, "ME!");

当我打电话给他时:

    undefined reference to `void cre::ui::addExecutable<void (&)(char const*), char const (&) [4]>(void (&)(char const*), char const (&) [4])'

编译说:

if(getIntent().getExtras()!=null) { 
      String month = getIntent().getStringExtra("month");
      String mDay = getIntent().getExtras().getString("date");
      if(!TextUtils.isEmpty(mDay)
          date.setText(mDay + "" + month);
      else // mDay will empty from icon click.
          date.setText("");

 }

我对模板不是很熟悉并做了一些谷歌但没有得到线索。那么如何才能正确实现“addExecutable”呢?谢谢!

如果您需要,所有源代码都是here

3 个答案:

答案 0 :(得分:1)

这里似乎有多个问题:

  1. 您收到链接器错误,因为您将模板放入.cpp文件中。模板通常必须内联。

  2. 您可以使用C样式va_start / va_list混合使用C ++样式处理变量参数的模板。这不起作用。在这种情况下,您应该坚持使用C ++方式并删除函数中的前两行。

答案 1 :(得分:0)

我猜你忘了在调用函数名后面指定参数列表:

  

模板返回类型名称&lt; argument-list&gt; (参数列表);

  

addExecutable&lt; Fn,Class1,Class2&gt;(helloWorld,“ME!”);

请参阅http://en.cppreference.com/w/cpp/language/function_template

答案 2 :(得分:0)

如果您是用C ++编写的,那么最好使用C ++之类的东西,例如bindfunction

这里有一个例子:

#include <iostream>
#include <vector>
#include <functional>

// Collection of what you want to execute.
std::vector<std::function<void()>> vec;

// Add to the collection to be executed.
template<typename Fn, typename ...Args>
void addExecutable(Fn&& fn, Args&&... args)
{
    vec.push_back(
            std::bind(std::forward<Fn>(fn), std::forward<Args>(args)...)
    );
}

// Execute everything in the collection.
void execute()
{
    for (auto& it: vec)
    {
        it();
    }
}

void helloWorld(std::string const& name)
{
    std::cout << "Hello " << name << std::endl;
}

void hello(std::string const& firstname, std::string const& lastname)
{
    std::cout << "Hello " << firstname << " " << lastname << std::endl;
}

int main()
{
    addExecutable(helloWorld, "Me");
    addExecutable(helloWorld, "You");
    addExecutable(hello, "John", "Smith");

    execute();

    return 0;
}