【问题标题】:variadic template class to make a deferred call to a variadic template function可变参数模板类对可变参数模板函数进行延迟调用
【发布时间】:2014-12-03 20:05:09
【问题描述】:

我可以创建一个模板类,在属性中存储一些值,然后让我稍后调用一个方法,该方法使用这个参数调用一个函数。像这样:

template <typename U> void g(U u) { cout << u << endl; }
template <typename U> class C {
public:
        U u;
        C(U u) { this->u = u; }
        void m() { g(u); }
};

int main() {
        C<double> c(5.5);
        c.m();
}

但是如何用可变参数模板做同样的事情呢?我想写一些类似的东西:

template <typename ... T> void f(T... a) { cout << "generik" << endl; }

template <typename ... T> class B {
    public:
        T... arg;
        B(T... arg) {
             this->arg = arg;
        }
        void m() { f(arg); }
};

int main() {
    B<int,double> b(1,1.1);
    b.m();
}

我知道这行不通,因为我们不能声明解压参数类型的成员。

我可以对列表的某些参数进行模式匹配,然后在给定数量的参数时调用该函数,但我想以通用方式进行。有什么优雅的方法吗?

【问题讨论】:

  • 您的第一个示例也未能完善。您是否打算多次调用m?也许只有&amp;&amp; 重载应该完美向前...
  • 这不是重点,但谢谢。

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


【解决方案1】:

你可以使用类似下面的东西:

template <typename... Ts> class B
{
public:
    std::tuple<Ts...> t;
    B(Ts... args)
        : t(args...)
    {
    }
    void m() { call_f(std::index_sequence_for<Ts>()); }

private:
    template <std::size_t ... Is>
    void call_f(std::index_sequence<Is...>)
    {
        f(std::get<Is>(t)...);
    }
};

请注意,std::index_sequence_for (std::make_index_sequence) 和 std::index_sequence 是 C++14,但可以用 C++11 编写。

Live example.

【讨论】:

  • 可能想提一下make_index_sequence 的作用。或者我猜他们可以用谷歌搜索。 index_sequence_for&lt;Ts...&gt; 也可能比 make_index_sequence&lt;sizeof...(Ts)&gt; 更好。
  • 感谢大家的好回复,但我更喜欢@Brandon 的回答:它完全符合 C++11 并且更简单一些。即使你的存储数据而不是函数调用......我犹豫了......
【解决方案2】:

http://ideone.com/OPl7Rz

#include <iostream>
#include <functional>

using namespace std;

template<typename... T>
void f(T... a)
{
    std::initializer_list<int> {(std::cout<<a<<" ", 0)...};
}

template<typename... T>
class Defer
{
    private:
        std::function<void()> func;

    public:
        Defer(T... a) : func(std::bind(f<T...>, a...)) {}
        void call() {func();}
};



int main()
{
    Defer<int, float, int, const char*> d(1, 1.1, 2, "Hey");
    d.call();
    return 0;
}

【讨论】:

  • 感谢@Brandon,这符合我的需要和他的完美优雅!不知道为什么我没有考虑绑定(需要更多地挖掘可变参数模板和标准库)。
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 2016-12-01
  • 2019-08-12
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多