如果在可变参数模板解包中到达终止函数,则异常

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

所以我正在玩模板和constexpr,特别是可变参数模板,我做了以下功能:

template <typename T>
constexpr T get_argument(size_t index)
{
  return T();
};

template <typename T, T arg, T... args>
constexpr T get_argument(size_t index)
{
  return index ? get_argument<T,args...>(index-1) : arg;
}

这里的终止函数目前是一个虚拟占位符。所以这个函数有效,但如果超出范围则返回0,我希望它做的是崩溃...但它需要2种失败模式。 get_argument可以在编译时调用,我希望索引超出范围会导致编译器错误。或者它可以在运行时调用,我希望它抛出运行时错误...

我也可以选择:

template <typename T>
constexpr T get_argument(size_t index)
{
  return false ? T() : throw std::out_of_range("Index out of argument range");
}

template <typename T, T arg, T... args>
constexpr T get_argument(size_t index)
{
  return index ?
        (count_args<T,args...>() ?
           get_argument<T,args...>(index-1) :
           throw std::out_of_range("Index out of argument range")) :
        arg;
}

但是1)我不喜欢语法(总是错误的条件,加上在模糊的尝试中检查两次以使输出意味着什么),以及2)错误是混乱的:

test.hpp:32:69: error: expression '<throw-expression>' is not a constant-expression
            throw std::out_of_range("Index out of argument range")) :

谁有更好的方法?

c++ c++11 variadic-templates constexpr
1个回答
3
投票

以下可能有所帮助(只有一项检查):

template <typename T, T ... Ts>
constexpr std::array<T, sizeof...(Ts)> getArray()
{
    return {{Ts...}};
}

template <typename T, T ... Ts>
constexpr T get_argument(size_t index)
{
  return index < sizeof...(Ts) ?
    const_cast<const std::array<T, sizeof...(Ts)>&&>(getArray<T, Ts...>())[index] :
    throw std::out_of_range("Index out of argument range");;
}

C ++ 14可能有所帮助,可能有几个语句,如:

  • 局部变量(不需要这个const_cast
  • assert(可能除了throw之外)。
© www.soinside.com 2019 - 2024. All rights reserved.