通过显式 class 获取可变模板非类型参数

Obtaining variadic template non-type parameter through explicit class

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...>;

导致编译错误。仅在添加模板参数时出错。

注意:我还没有 translate<Cs...> 的明确定义,它绝对可以被视为一种算法,正如可变参数模板所期望的那样。但是,我隐含地使用了这个算法,因为 static_cast<T>(x) 显然不会通过可变模板参数包的分配进行编译,即 Cs...,到 x.

编辑:对于第一个问题,我可以尝试创建一个包含相关信息的显式结构,与 std::tuple 非常相似,但不包含类型,而是包含字符,以便可以通过

using T = char_tuple<Cs...>;

EDIT2:第二个问题试图完成递归,以便使用所有可用的算法。

不是很清楚你想要什么...但是...

第一。

第一个问题,我想这样更好,对你来说,修改safe_implicit_cast接收单个typename

template <typename>
struct safe_implicit_cast;

并定义一个偏特化,接收一个 std::integer_sequence char based

template <char ... Cs>
struct safe_implicit_cast<std::integer_sequence<char, Cs...>>
 {
   // using T, constexpr T value, etc
 };

通过这种方式,您可以在算法 (algo0algoS...) 中创建一个 type、非值,即 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...>

其中第一个 valueintfloat

也许您的意思是使用其他 algos... 递归调用 value

也许如下(注意:未测试)?

safe_implicit_cast<typename algo0<Cs...>::type>::template value<algoS...>