C++ 迭代基类和可变参数列表

C++ 迭代基类和可变参数列表,c++,templates,variadic-templates,C++,Templates,Variadic Templates,假设我有一个带有方法fun的以下结构 template<class T, template <class> class ... base_t> struct S : base_t<T> ... { template<class ... args_t> void fun(args_t& ... args) { //Here } }; 然后此代码应打印4.2 4.2 42: S<double, D

假设我有一个带有方法
fun
的以下结构

template<class T, template <class> class ... base_t>
struct S : base_t<T> ... {
    template<class ... args_t>
    void fun(args_t& ... args) {
        //Here
    }
};
然后此代码应打印
4.2 4.2 42

S<double, D1, D2, I> s;
double a, b;
int c;
s.fun(a, b, c);
std::cout << a << ' ' << b << ' ' << c << std::endl;
S;
双a,b;
INTC;
s、 乐趣(a、b、c);

C++17中的std::cout,带折叠表达式:

template <typename ... base_t>
struct S : base_t ... {
    template<typename ... args_t>
    void fun(args_t& ... args) {
        (base_t::operator()(args), ...);
    }
};
模板
结构S:基础\u t。。。{
模板
虚无乐趣(args\u t&…args){
(base_t::operator()(args),…);
}
};

在C++17中,使用折叠表达式:

template <typename ... base_t>
struct S : base_t ... {
    template<typename ... args_t>
    void fun(args_t& ... args) {
        (base_t::operator()(args), ...);
    }
};
模板
结构S:基础\u t。。。{
模板
虚无乐趣(args\u t&…args){
(base_t::operator()(args),…);
}
};

我还没有得到第一个代码,这看起来像是从模板类继承而来的。您使用它的示例不适用,因为
D
I
不是任何类型的模板。是的,对不起,我重写了代码,犯了一些错误,现在应该可以了。它仍然不能。我认为唯一需要的改变是把
放在
之前。。。base_t
,并在
struct
s
D
I
@KamilKoczurek的定义后加上分号就足够了,但您应该在编译器中放上最小的示例。你的类模板参数列表是。我还没有得到第一个代码,这看起来像是从模板类继承而来的。你使用它的例子不适用,因为
D
I
不是任何类型的模板。是的,对不起,我重写了代码,犯了一些错误,现在应该可以了。它仍然没有。我认为唯一需要的改变是把
放在
之前。。。base_t
,并在
struct
s
D
I
@KamilKoczurek的定义后加上分号就足够了,但您应该在编译器中放上最小的示例。您的类模板参数列表为。由于
运算符()
不接受参数,而是返回结果,因此需要将其设置为
args=base\u t::operator()()
,需要将其包装在一组额外的括号中,以消除折叠表达式中可能出现的明显歧义。@DanielH:在这种情况下,我会做
std::tie(args…=std::forward_as_tuple(base_t::operator()())。由于
运算符()
s不接受参数,而是返回结果,因此需要使用
args=base\u t::operator()
,它需要被包装在一组额外的括号中,以消除折叠表达式中出现明显歧义的可能性。@DanielH:在这种情况下,我会使用
std::tie(args…)=std::forward_as_tuple(base_t::operator()()…)