是否可以将可变参数存储到成员变量中?

时间:2015-03-23 20:58:21

标签: c++ templates c++11 variadic-templates

我想知道是否可以将可变参数模板参数存储到成员变量中,例如元组?所以我可以在另一种方法中使用它。我希望它能像这样工作,见下文:

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。

1 个答案:

答案 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的实施方式。