如何将可变参数从一个模板传递到另一个模板
How to pass variadic parameters from one template to another
我有这个代码:
#include <tuple>
#include <memory>
template <typename ...Args>
class Button
{
Button(const std::string& name, Args&& ...args) {
std::tuple<Args...> tuple_ = std::tuple<Args...>(args...);
}
};
template<typename T1, typename ...Args>
void addObject(const std::string& name, Args&& ...args) {
std::unique_ptr<T1> obj(new T1(name, std::forward<Args>(args)...));
//...rest of the code...
}
int main() {
//if we comment the next line it compiles well
addObject<Button>("BtnName", 0, 1, 2);
return 0;
}
但是,编译时不会出现 "error LNK2019: unresolved external symbol..." 或 "no matching function for call to 'addObject class Button>(const char [8], int, int, int)'" 之类的错误。如果我们评论 "addObject" 函数,它编译得很好。
如何以正确的方式将参数传递给另一个模板?
Button
是一个 class 模板;在 addObject<Button>("BtnName", 0, 1, 2);
中使用它时,您必须为其指定模板参数,如 Button<...some arguments...>
.
除了上面的解决方案,也许你想将模板参数 Args
从 class 移动到 Button
的构造函数,然后它可以从函数参数推导出来(即 std::forward<Args>(args)...
).
class Button
{
public:
template <typename ...Args>
Button(const std::string& name, Args&& ...args) {
std::tuple<Args...> tuple_ = std::tuple<Args...>(std::forward<Args>(args)...);
}
};
其他问题:
Button
的构造函数是private
。
- 没有
#include <string>
。
您可以创建一个具有模板模板类型参数的模板,这样您就不必指定参数类型,如下所示
#include <tuple>
#include <memory>
#include <string>
template <typename ...Args>
struct Button
{
Button(const std::string& name, Args&& ...args) {
auto tuple_ = std::make_tuple<Args...>(std::forward<Args>(args)...);
}
};
template<template <typename ...Args> typename T1, typename ...Args>
void addObject(const std::string& name, Args&& ...args) {
auto obj = std::make_unique< T1 <Args...> >(name, std::forward<Args>(args)...);
//...rest of the code...
}
int main() {
addObject<Button>("BtnName", 0, 1, 2);
return 0;
}
我有这个代码:
#include <tuple>
#include <memory>
template <typename ...Args>
class Button
{
Button(const std::string& name, Args&& ...args) {
std::tuple<Args...> tuple_ = std::tuple<Args...>(args...);
}
};
template<typename T1, typename ...Args>
void addObject(const std::string& name, Args&& ...args) {
std::unique_ptr<T1> obj(new T1(name, std::forward<Args>(args)...));
//...rest of the code...
}
int main() {
//if we comment the next line it compiles well
addObject<Button>("BtnName", 0, 1, 2);
return 0;
}
但是,编译时不会出现 "error LNK2019: unresolved external symbol..." 或 "no matching function for call to 'addObject class Button>(const char [8], int, int, int)'" 之类的错误。如果我们评论 "addObject" 函数,它编译得很好。
如何以正确的方式将参数传递给另一个模板?
Button
是一个 class 模板;在 addObject<Button>("BtnName", 0, 1, 2);
中使用它时,您必须为其指定模板参数,如 Button<...some arguments...>
.
除了上面的解决方案,也许你想将模板参数 Args
从 class 移动到 Button
的构造函数,然后它可以从函数参数推导出来(即 std::forward<Args>(args)...
).
class Button
{
public:
template <typename ...Args>
Button(const std::string& name, Args&& ...args) {
std::tuple<Args...> tuple_ = std::tuple<Args...>(std::forward<Args>(args)...);
}
};
其他问题:
Button
的构造函数是private
。- 没有
#include <string>
。
您可以创建一个具有模板模板类型参数的模板,这样您就不必指定参数类型,如下所示
#include <tuple>
#include <memory>
#include <string>
template <typename ...Args>
struct Button
{
Button(const std::string& name, Args&& ...args) {
auto tuple_ = std::make_tuple<Args...>(std::forward<Args>(args)...);
}
};
template<template <typename ...Args> typename T1, typename ...Args>
void addObject(const std::string& name, Args&& ...args) {
auto obj = std::make_unique< T1 <Args...> >(name, std::forward<Args>(args)...);
//...rest of the code...
}
int main() {
addObject<Button>("BtnName", 0, 1, 2);
return 0;
}