[英]C++ variadic macro and template
我在玩可变参数宏和模板。 有没有简单的方法可以实现以下目的?
就像std :: make_tuple。 如何实现make_my_class? 我看到我可能需要“ std :: decay”,但是我不太明白。 非常感谢。
template <typename... Args>
class my_class
{
public:
my_class(Args... args)
: items_(args...)
{
}
private:
std::tuple<Args...> items_;
};
// How to fix this line?
#define CREATE_MY_CLASS(var_name, args...) my_class<decltype(args...)> var_name(args...);
// Usage:
// CREATE_MY_CLASS(xyz, 1, 2, 3)
// Target:
// my_class<decltype(1), decltype(2), decltype(3)> xyz(1, 2, 3);
使用功能模板有什么问题?
template <typename ... Args>
my_class<Args...> get_my_class(Args&&...args)
{
return my_class<Args...>(std::forward<Args>(args)...);
}
auto x = get_my_class(1,2,3,4,5,6);
使用宏的可变参数需要__VA_ARGS__
,我不知道如何或是否可以将其传递给decltype()
因为您需要做的事情将等于decltype(args)...
以获取类型列表的args
。 函数模板通过其隐式模板推导来绕过所有这些,而auto
关键字意味着您不必知道将什么类型传递给my_class
来声明适当类型的变量。
您可以这样做:
#include <iostream>
#include <tuple>
#include <utility>
// my_class declaration
// ...
template <typename... Args>
my_class<Args...> make_my_class(Args&&... args) {
return my_class<Args...>( std::forward<Args>(args)... );
}
int main() {
auto f = make_my_class(1,2);
}
小解释:这与std :: make_pair的工作方式相同。 make_my_class正在接收右值引用并转发到my_class构造函数中。 默认情况下, make_my_class的返回值也应为rvalue。 我认为这种构建方法的开销应该为零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.