我想知道是否可以将可变参数模板参数存储到成员变量中,例如元组?所以我可以在另一种方法中使用它。我希望它能像这样工作,见下文:
class TempClass
{
public:
//How can I Store the arguments with the help of a variable?
std::tuple<Template Args?> savedArgs;
template<typename ...Args>
void SaveTheseArgs(args&& ...args)
{
//Store the arguments into a variable for later use
savedArgs = std::make_tuple<Args>(args);
//Do something with the args...
}
void OtherMethod()
{
//I want to pass it back to the same method with the same arguments.
SaveTheseArgs(savedArgs);
}
}
//I tried a struct template like this, but this actually doesn't store them unless I am doing something wrong.
template<typename... Args>
struct StoredArguments
{
std::tuple<Args...> StoredArgs;
};
我是C ++编程的新手。我有其他语言的经验,如C#,AS3,Java。
答案 0 :(得分:2)
假设我正确地阅读了你的思想,你就可以通过不保存args来保存args。
首先,写下这个:
void DoOperation( std::tuple<int, double, std::string> const& tup ) {
auto&& some_arg_name = std::get<0>(tup);
auto&& second_arg_name = std::get<1>(tup);
// etc
// do stuff with the args
}
typedef std::function<void(TempClass*)> saved_operation;
saved_operation BuildOperation( int a, double b, std::string s ) const {
auto tup = std::make_tuple(a,b,s);
return [tup](TempClass* self){
return self->DoOperation(tup);
};
}
DoOperation
接受一个元组,并使用这些参数进行操作。
BuildOperation
接受参数,将它们捆绑成一个元组,并从中生成saved_operation
。
saved_operation
基本上是一个保存的方法调用。我不会存储this
,因为通过避免这种情况,默认副本ctor会做正确的事情。相反,您每次使用时都会传递this
。
现在使用上面的内容,我们实现了你的东西:
saved_operation saved_op;
template<typename ...Args>
void SaveTheseArgs(args&& ...args)
{
saved_op = BuildOperation(std::forward<Args>(args)...);
saved_op(this);
}
void OtherMethod()
{
assert(saved_op);
saved_op(this);
}
tuple
的副本实际上存储在saved_operation
对象中,但这是一个实现细节。
诀窍是我们不关心数据,而是关注我们以后做的数据。
我使用了一些具体类型(int
double
等),但这些也很容易成为模板方法。
如果您需要效率,那么更多关注移动数据而不是复制可能是有用的。但我保持相对简单。如果你真的需要一包任何args,你可能需要google&#34;索引技巧&#34;将未知内容的元组解压缩回参数。
在这种情况下,std::function
是一个类型擦除类,它擦除了构造它的细节,除了它可以被复制,销毁,使用特定签名调用的事实(以及回送-to-source-type,很少有人使用。)
我们利用这个来忘记&#34; tuple
而只是记住我们想要对tuple
进行的操作。
这种技术可以在更一般的情况下使用:你可以输入带有固定签名的任何东西,或者任何可以归结为固定签名的东西(有点宽泛)。
要搜索有关此主题的更多信息,请参阅&#34;运行时概念&#34;和&#34;键入擦除&#34;。检查std::function
的实施方式。