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

时间:2016-05-07 01:49:07

标签: c++ templates variadic-templates

例如:

<?php
    $path = sprintf('advertiser_images/%s', $_POST['data'][0]);

    mkdir($path, 0755, true);
?>

或:

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

或任何具有类似效果的东西?

1 个答案:

答案 0 :(得分:2)

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

虽然函数可以返回std::tuple

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

您还可以将此模板专门用于单个类型,并返回类型而不是单元素元组;并将其专门用于空参数包,并返回void

编辑:

你澄清了你的问题。你试图做一些不同的事情,你的初步解释可以理解为有点不合时宜。

你可以完成你正在寻找的东西,但它有点复杂,需要递归模板和专业化,但看起来这就是你想要的。

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.
}