【问题标题】:Is Parameter pack contained in other Parameter pack参数包是否包含在其他参数包中
【发布时间】:2021-03-11 13:36:37
【问题描述】:

我正在编写一个管理函数对象的类(为了好玩:))。

我想要一个模板化类的模板化成员函数来检查给它的所有类型是否已经给了这个类。

template<typename... Args>
class funclass
{
    public:
    template<typename... types>
    void funfun ()
    {
        static_assert(/*is every type in types contained in Args*/);
    }
};

【问题讨论】:

标签: c++ variadic-templates template-meta-programming


【解决方案1】:

您可以使用帮助程序来检查给定的 T 是否是 Args... 包的一部分:

template <typename T, typename ...Args>
struct contains {
    static constexpr bool value = (std::is_same<T,Args>::value || ...);
};

然后检查types...中的所有类型:

template<typename... Args>
struct funclass
{
    template<typename... types>
    void funfun ()
    {
        constexpr bool contains_all = (contains<types,Args...>::value && ...);
        static_assert( contains_all  );
    }
};

int main() {
    funclass<int,double>{}.funfun<int>(); // OK
    funclass<int,double>{}.funfun<float>(); // error
}

【讨论】:

  • contains 可以是consteval 函数吗? (而且我认为你可以使用 std::disjunction 和 std::conjunction 对吗?
  • @EyalKamitchi 是的,它可能是一个函数,尽管我对consteval 的经验为零。我也不知道std::disjunctionstd::conjunction :)
【解决方案2】:

如果你也想强制它们的顺序相同,你可以生成两个tuple类型然后比较它们,如下

#include <type_traits>
#include <tuple>
template<typename... Args>
struct Fun{
    template<typename... types>
    void fun (){
        static_assert(std::is_same_v<std::tuple<Args...>,std::tuple<types...>>);
    }
};
int main(){
    Fun<int,bool>{}.fun<int, bool>();//passes
    Fun<int,bool>{}.fun<int, bool, double>();//fails

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 2018-07-25
    • 2022-01-02
    • 1970-01-01
    • 2013-05-06
    • 2017-11-15
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多