如何在可变数量的参数中传递 std::initializer_list ?

问题描述 投票:0回答:1

我想在打印每个参数的函数的可变数量参数内传递一个

std::initializer_list

func( 1, 2.5, 'a', "Hello", {10, 20, 30, 40 } );

期待这个输出:

1
2.5
a
Hello
{ 10, 20, 30, 40, }

我尝试按照另一个问题的answer来实现它。

#include <iostream>
#include <initializer_list>

template <typename T>
void func_(std::initializer_list<T> list ) 
{
    std::cout << "{ ";
    for( const T& elem : list )
    {
       std::cout << elem << ", ";
    }
    std::cout << "}" << std::endl;
}

template <typename T>
void func_(T t) 
{
    std::cout << t << std::endl;
}

void func(){}

template<typename T, typename... Args>
void func(T t, Args... args) // recursive variadic function
{
    func_(t);
    func(args...) ;
}

int main()
{
    func( 1,2.5,'a', "Hello", {10, 20, 30, 40 });
}

我尝试实现的另一种方法

func

template <typename T, typename S>
void func(T t) 
{
    if constexpr (std::is_same<T, std::initializer_list<S>>::value)
    {
        std::cout << "{ ";
        for( const S& elem : t )
        {
            std::cout << elem << ", ";
        }
        std::cout << "}" << std::endl;
    }
    else
        std::cout << t << std::endl;
}

template<typename T, typename... Args>
void func(T t, Args... args) // recursive variadic function
{
    func(t);
    func(args...);
}

他们都没有工作

c++ templates variadic-functions initializer-list
1个回答
0
投票

问题是花括号初始化列表没有类型。所以我们必须显式指定类型说明符。

我能想到的最简单的方法是创建一个带有

std::initializer_list
ctor 的类,然后使用它,如下所示:

struct V
{
    V(std::initializer_list<int> v): m_t(v)
    {
        
    }
    friend std::ostream& operator<<(std::ostream& os, const V& v)
    {
        std::cout << "{ ";
        for(const auto i: v.m_t)  
        {
             std::cout << i << " "; 
        }
        std::cout << "}";
        return os;
    }
    std::initializer_list<int> m_t;
};
int main()
{
    func_( 1,2.5,'a', "Hello", V{10, 20, 30, 40 });//works now prints 
} 

工作演示

© www.soinside.com 2019 - 2024. All rights reserved.