C++ 是否可以为包中的每个参数声明一个方法?

C++ 是否可以为包中的每个参数声明一个方法?,c++,templates,variadic-templates,C++,Templates,Variadic Templates,例如: template<class... keys> struct{ { virtual keys* getContents(foo* Foo) const = 0 }...; } 模板 结构{ {virtualkeys*getContents(foo*foo)const=0}。。。; } 或: 模板 结构{ 虚拟条*getBar(键*Foo)…常量=0; } 或具有类似效果的任何内容?函数或方法无法返回参数包 函数可以返回std::tuple,但: template

例如:

template<class... keys>
struct{
    { virtual keys* getContents(foo* Foo) const = 0 }...;
}
模板
结构{
{virtualkeys*getContents(foo*foo)const=0}。。。;
}
或:

模板
结构{
虚拟条*getBar(键*Foo)…常量=0;
}

或具有类似效果的任何内容?

函数或方法无法返回参数包

函数可以返回
std::tuple
,但:

template<class... keys>
struct something {
    virtual std::tuple<keys...> getContents(foo* Foo) const = 0;
}

我真正想做的是,要求派生类为它们向基类播发的每个“键”实现gettor。如果我手动专门化它们,那就意味着在任何派生类更改时都要重新编写基类。有没有办法为包中的每种类型获得一种方法?好的,我更新了我的答案,以回应你的澄清。哇。你有没有更新过这个答案。这似乎正是我想要的。这种解释正确吗?每次“getcontents_base”被专门化时,编译器都会定义getBar的一个专门化,而不是从参数包中少一个类型开始?因此,当它完成时,继承图中的每个getcontents_基都有一个版本的getBar,说明了“getcontents”最初传递给它的所有类型?这就是它的工作原理。过载解决方案可能存在一些问题。如果是这样的话,可能需要为具有单个参数的参数包定义专门化,并将“using getcontents_base::getBar;”添加到递归模板中。这取决于您的应用程序,您是否需要这样做。
template<class... keys>
struct something {
    virtual std::tuple<keys...> getContents(foo* Foo) const = 0;
}
class bar;

template<typename ...Keys> struct getcontents_base;

template<>
struct getcontents_base<> {
};

template<typename firstKey, typename ...remainingKeys>
struct getcontents_base<firstKey, remainingKeys...>
    : getcontents_base<remainingKeys...> {

    virtual bar *getBar(firstKey *foo) const=0;
};

struct getcontents : public getcontents_base<int, char> {

    bar *getBar(int *) const override {}
    bar *getBar(char *) const override {}
};

struct notgetcontents : public getcontents_base<int, char> {};

void foo()
{
    struct getcontents c; // This will compile fine.

    struct notgetcontents c2; // This will result in a compilation error
                              // because the virtual methods have not
                              // been defined.
}