【发布时间】:2018-08-03 10:42:57
【问题描述】:
template <char... Cs>
struct safe_implicit_cast
{
using T = std::conditional_t<is_decimal_number<Cs...>::value, float, int>; // awkward: algo<Cs...> often already provides is_number_X (irrelevant, copied from code)
// note T is created derived from a sequence of std::conditional_t's. Only one provided for the sake of simplicity and easily readable code for this post.
template <template<char...> class algo0, template<char...> class... algoS>
static constexpr T value =
algo_is_same< algo0, algo_null_type>::value
? static_cast<T>(translate<Cs...>::value)
: safe_implicit_cast<algo0<Cs...>::value>::f(); // SFINAE
};
我对这段代码有两个问题。首先想知道有没有办法获取algo0内的variadic参数所持有的数据;在这种情况下,Cs... 字符包的更新版本,存储在value 中。
其次,我注意到当我改变时
: safe_implicit_cast<algo0<Cs...>::value>::f();
到
: safe_implicit_cast<algo0<Cs...>::value::value<algoS...>;
导致编译错误。只有在添加模板参数时才会出错。
注意:我还没有对translate<Cs...> 的明确定义,它绝对可以被认为是一种算法,正如可变参数模板所期望的那样。但是,我隐式地使用了这个算法,因为static_cast<T>(x) 显然不能通过将可变参数模板参数包(即Cs...)分配给x 进行编译。
编辑:对于第一个问题,我可以尝试创建一个包含相关信息的显式结构,与std::tuple 非常相似,但不包含类型,而是字符,以便可以通过以下方式获取数据
using T = char_tuple<Cs...>;
EDIT2:第二个问题试图完成递归,以便使用所有可用的算法。
【问题讨论】:
标签: templates c++14 variadic-templates template-meta-programming sfinae