c++ 为使用数组,向量,结构等传递给可变函数或可变参数模板函数w/out的所有参数指定一个类型?

我创建一个函数(可能是成员函数,不是很重要…也许它吗?),需要接受未知数量的参数,但我想让他们是相同的类型。我知道我可以传入一个数组或向量,但我想能够直接接受args的列表,没有额外的结构,甚至额外的方括号。它看起来不像可变函数本身是类型安全的,我不知道如何去这个w /可变参数模板函数。这里基本上是我的目标(更可能不是正确的代码,完全不是为了获得列表的龙,lol的目的):

//typedef for dragon_list_t up here somewhere.

enum Maiden {
    Eunice
    , Beatrice
    , Una_Brow
    , Helga
    , Aida
};

dragon_list_t make_dragon_list(Maiden...) {
    //here be dragons
}

要么

template<Maiden... Maidens> dragon_list_t make_dragon_list(Maidens...) {
    //here be dragons
}

用法

dragon_list_t dragons_to_slay
    = make_dragon_list(Maiden.Eunice, Maiden.Helga, Maiden.Aida)
;

尝试了一些类似于上面已经,没有骰子。建议?我可能有明显的疏忽?我知道这可能不是一个巨大的事情,做到这一点:

dragon_list_t make_dragon_list(std::array<Maiden> maidens) {
    //here be dragons.
}
dragon_list_t dragons_to_slay
    = make_dragon_list({Maiden.Eunice, Maiden.Helga, Maiden.Aida})
;

但我更愿意能够做到第一个方法,如果可能的话。

最佳答案
您可以只接受可变参数模板,并让类型检查稍后检查有效性,当它们被转换。

你可以检查在函数接口级别的可兑换性,使用重载分辨率拒绝完全错误的参数,例如,使用SFINAE

template<typename R, typename...> struct fst { typedef R type; };

template<typename ...Args>
typename fst<void, 
  typename enable_if<
    is_convertible<Args, ToType>::value
  >::type...
>::type 
f(Args...);

对于你的使用case,如果你知道从std :: array<>到你的dragon_list_t然后你已经解决了,虽然根据上面的第一个选项(“convert-later”):

template<typename ...Items>
dragon_list_t make_dragon_list(Items... maidens) {
    std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }};
    // here be dragons
}

如果你结合上面的is_convertible方法,你有一个reject-early模板,它也对参数重载解析,如果不适用则拒绝它们。

转载注明原文:c++ 为使用数组,向量,结构等传递给可变函数或可变参数模板函数w/out的所有参数指定一个类型? - 代码日志