如何为包含的每个对象构造一个只有一个元素的元组?

How to construct a tuple with only one element for every object contained?

提问人:DipStax 提问时间:9/29/2023 更新时间:9/29/2023 访问量:68

问:

我有一个带有多个模板类的元组,其中只有类的模板会发生变化,例如:

template<template<class> class T, class ...Ts>
class TriggerMap;

template<template<class> class T, class ...Ts>
class TriggerMap<T, std::tuple<Ts...>>
{
    public:
        TriggerMap(ThreadPool &_tp) : m_map(_tp) {}
        ~TriggerMap() = default;

    private:
        using TriggerMapImp = typename tuple_apply_template<T, Ts...>::type;
        TriggerMapImp m_tup;
};

跟:tuple_apply_template

template<class, class>
struct tuple_prepend;

template<class T, class ...Ts>
struct tuple_prepend<T, std::tuple<Ts...>>
{
    using type = std::tuple<T, Ts...>;
};

template<template<class> class T, class ...Ts>
struct tuple_apply_template;

template<template<class> class T, class _T, class ...Ts>
struct tuple_apply_template<T, _T, Ts...>
{
    using type = typename tuple_prepend<T<_T>, typename tuple_apply_template<T, Ts...>::type>::type;
};

template<template<class> class T, class _T>
struct tuple_apply_template<T, _T>
{
    using type = std::tuple<T<_T>>;
};

我想用对象引用来构造我的对象,在这种情况下是对象,我怎样才能以有效的方式更改(实际上不起作用)的构造函数以进行运行时优化?ThreadPoolTriggerMap

C++ 模板 元编程

评论

0赞 Eljay 9/29/2023
相关:std::ref 和/或 std:reference_wrapper
1赞 Jarod42 9/29/2023
TriggerMapImp似乎只是std::tuple<T<Ts>...>
0赞 DipStax 9/29/2023
我不使用语法,因为我有其他行为,当使用它不会影响给定的问题时。tuple_apply_template
1赞 HolyBlackCat 9/29/2023
题外话:不好,任何析构函数都会阻止生成移动操作,这意味着每当您移动对象时,它都会被静默复制。~TriggerMap() = default;
0赞 DipStax 9/29/2023
你在文档中对这个偏离主题有任何参考吗?

答:

0赞 DipStax 9/29/2023 #1

为了编译构造函数,我将其更改为:

TriggerMap(ThreadPool &_tp) : m_map(T<Ts>(_tp)...) {}

评论

0赞 DipStax 9/29/2023
如果任何机构有这种语法的名称,请告诉我。
1赞 Jarod42 9/29/2023
包扩展
0赞 DipStax 9/29/2023
是的,谢谢!