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
中的可变参数所保存的数据。在这种情况下,Cs...
个字符包的更新版本存储在value
中。
其次,我注意到当我更改
: safe_implicit_cast<algo0<Cs...>::value>::f();
到
: safe_implicit_cast<algo0<Cs...>::value::value<algoS...>;
引起编译错误。仅在添加template参数时出错。
注意:我还没有一个明确的translate<Cs...>
定义,并且它可以肯定地被视为一种算法,因为可变参数模板有望实现。但是,我隐式使用了该算法,因为static_cast<T>(x)
显然不能与将可变参数模板参数包Cs...
分配给x
一起编译。
编辑:对于第一个问题,我可以尝试创建一个包含相关信息的显式结构,该结构与std::tuple
非常相似,但不包含类型,而是字符,以便可以通过
using T = char_tuple<Cs...>;
EDIT2:第二个问题试图完成递归,以便使用所有可用的算法。
答案 0 :(得分:1)
不是很清楚你想要什么...但是...
首先。
对于第一个问题,我想这更好,对您来说,修改safe_implicit_cast
以接收单个typename
template <typename>
struct safe_implicit_cast;
并定义部分专业化,该专业化基于std::integer_sequence
char
template <char ... Cs>
struct safe_implicit_cast<std::integer_sequence<char, Cs...>>
{
// using T, constexpr T value, etc
};
通过这种方法,您可以在算法(type
,algo0
)内创建algoS...
(其中std::integer_sequence<char, Ds...>
是一个非值的Ds...
是修改后的char
序列),随后的safe_implicit_cast
的(递归?)调用变为
safe_implicit_cast<typename algo0<Cs...>::type>
第二。
我根本不理解你的第二个问题,因为我不知道什么是f()
,也不知道你为什么要写
safe_implicit_cast<algo0<Cs...>::value::value<algoS...>
其中第一个value
是int
或float
也许您的意思是使用其他value
递归调用algos...
吗?
也许如下所示(警告:未经测试)?
safe_implicit_cast<typename algo0<Cs...>::type>::template value<algoS...>