如何将模板参数推送到数组

Posted

技术标签:

【中文标题】如何将模板参数推送到数组【英文标题】:How can I push template args to an Array 【发布时间】:2021-12-05 02:37:38 【问题描述】:

我想让这个函数在下面返回 来自模板 args 的整数值数组

template <int... args>
int* data(... args)

    int* m_data = // push template args to array

【问题讨论】:

您是否一心想要使用C 样式数组? std::vector 怎么样? 我正在尝试创建类似 std::vector 的东西,这是用于类的构造函数 您是否在data 函数中动态创建数组?或者,它是否在调用data 函数之前已经创建? data(... args) 不会编译。目前尚不清楚您是要将值作为模板参数还是作为“普通”函数参数传递。 data 应该怎么称呼? 这只是一个例子,我想知道 【参考方案1】:

您可以使用以下内容动态分配array 并在构造期间填充数组的元素。

动态数组

template<typename ...Args>
static int* data( Args&& ...args ) 

    constexpr auto size = sizeof...( Args );
    int* a1 new int[ size ] std::forward<Args>( args )...  ;
    return a1;


int main( ) 

    int* ptr data( 1, 2, 3, 4, 5, 6 ) ;
    delete[ ] ptr;

静态数组

template<typename ...Args>
static int* data( Args&& ...args ) 

    constexpr auto size = sizeof...( Args );
    static int a1[ size ] std::forward<Args>( args )... ;
    return a1;


int main( ) 

    int* ptr data( 1, 2, 3, 4, 5, 6 ) ;
    

构造后填充数组

template<typename ...Args>
static int* data( Args&& ...args ) 

    constexpr auto size = sizeof...( Args );

    // Use can also use a static array here instead.
    int* a1 new int[ size ] ;

    std::size_t count 0 ;
    for ( auto value :  std::forward<Args>( args )...  )
    
        a1[ count++ ] = value;
    

    return a1;


int main( ) 

    int* ptr data( 1, 2, 3, 4, 5, 6 ) ;
    delete[ ] ptr;

断言所有值都是 int 类型

template<typename ...Args>
static int* data( Args&& ...args ) 

    static_assert( std::conjunction_v<std::is_same<int, Args>...>, 
        "All args must be of type 'int'" );

    constexpr auto size = sizeof...( Args );
    int* a1 new int[ size ] std::forward<Args>( args )...  ;
    return a1;


int main( ) 

    int* ptr data( 1, 2, 3, 4, 5, 6, 7.0 ) ;
    delete[ ] ptr;

【讨论】:

不需要动态分配。只需创建一个静态数组并返回它。 @0x499602D2 我不确定他的用例是什么,这就是我选择动态数组的原因。我会同时显示。 如果我想用特定类型(例如 int)制作 args 怎么办 @SobhyRzk 编辑了答案以显示如何使用static_assert 来验证所有值的类型为int @SobhyRzk 如果我的回答对你有帮助,请务必采纳。

以上是关于如何将模板参数推送到数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将某个函数推送到返回数组的函数?(是否可以推送到返回数组的函数)[关闭]

如何将值从 listObjects 推送到数组

如何使用ajax将数据推送到数组

如何将值推送到 Cypher 中的属性数组?

如何设置状态并推送到数组?

如何正确地将具有多个元素的新对象推送到数组中?