默认初始化(使用值初始化)参数包

问题描述 投票:3回答:3

我可以默认将参数包初始化为每种类型的相应值初始化吗?

要详细说明,以一个简单的功能模板为例

template<typename T>
void f(T arg = T())
{ 
  // eg for T=int, arg is 0 (value initialization) when default initialized
}

是否有可能表达其可变参数,例如

template<typename... Args>
void F(Args... args /* how can I value initialize the parameter pack? */)
{
}
c++ c++11 templates variadic-templates
3个回答
3
投票
#include <iostream>
#include <utility>
#include <tuple>
#include <cstddef>
#include <type_traits>

template <typename... Args>
void F(Args... args)
{
    // target function, arbitrary body
    using expander = int[];
    (void)expander{ 0, (void(std::cout << args << " "), 0)... };
    std::cout << std::endl;
}

template <typename... Args, typename... Params, std::size_t... Is>
void F(std::index_sequence<Is...>, Params&&... params)
{
    F<Args...>(std::forward<Params>(params)...
             , std::decay_t<typename std::tuple_element<sizeof...(Params) + Is, std::tuple<Args...>>::type>{}...);
}

template <typename... Args, typename... Params>
auto F(Params&&... params)
    -> std::enable_if_t<(sizeof...(Args) > sizeof...(Params))>
{
    F<Args...>(std::make_index_sequence<sizeof...(Args) - sizeof...(Params)>{}
             , std::forward<Params>(params)...);
}

3
投票

您可以创建两个参数包,一个参数包代表与功能参数相对应的类型,一个参数包代表“默认参数”。


2
投票

它被C ++标准明确禁止,您不能这样做。N3376 8.3.6 / 3

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