如果在可变参数模板解包中达到终止函数,则出现异常
Exception if terminating function reached in variadic template unpacking
所以我正在使用模板和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")) :
有人有更好的方法吗?
以下可能会有所帮助(仅进行一次检查):
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
之外)。
相关文章:
- 为什么我的 while 函数没有终止?
- 在字符串函数中抛出'char const*'实例后调用的终止
- 程序终止时调用函数
- 当加入 C++11 函数的线程仍未终止时,是否可以返回?
- 在使用标准向量函数时引发'std::bad_alloc'实例后调用的终止
- 可变参数模板中递归模板函数的终止问题
- 如何提前终止在另一个文件中定义的函数?
- 如何在执行期间终止(或返回)具有结构类型的自动函数
- 我在执行 levelOrder 函数时无法弄清楚异常终止的原因?
- c 在函数的循环终止时
- 为什么我的析构函数中的异常没有触发 std::终止?
- 如何使用unique_ptr声明调用构造函数并处理程序终止信号
- 程序在函数返回后被终止
- 程序是否可以在调用kill函数之前返回/终止
- Windows资源监视器使用哪些Win32函数来检测已终止进程的磁盘和网络活动
- CMake 解析错误函数缺少结尾")"。而是找到带有文本的未终止字符串")
- 非终止constexpr函数定义明确
- cin函数是否添加了在输入结束时终止的null
- 如果在可变参数模板解包中达到终止函数,则出现异常
- 如何返回0并从函数终止