【发布时间】:2014-03-09 13:27:18
【问题描述】:
所以我在玩模板和 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")) :
谁有更好的方法?
【问题讨论】:
-
你有没有想过返回一个指针(超出范围时为空)?
-
@MatthieuM。在有效的情况下它会指向什么? Args 仅作为模板参数存在...
-
啊,对了,不幸的是没有
std::option...我想你可以自己包装它(使用布尔值和默认T创建你自己的简单option<T>)。
标签: c++ c++11 variadic-templates constexpr