我想要实现的很简单,就像:
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。
答案 0 :(得分:1)
这里似乎有多个问题:
您收到链接器错误,因为您将模板放入.cpp
文件中。模板通常必须内联。
您可以使用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 ++之类的东西,例如bind和function
这里有一个例子:
#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;
}