【问题标题】:Obtaining variadic template non-type parameter through explicit class通过显式类获取可变参数模板非类型参数
【发布时间】: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&lt;Cs...&gt; 的明确定义,它绝对可以被认为是一种算法,正如可变参数模板所期望的那样。但是,我隐式地使用了这个算法,因为static_cast&lt;T&gt;(x) 显然不能通过将可变参数模板参数包(即Cs...)分配给x 进行编译。

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

using T = char_tuple<Cs...>;

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

【问题讨论】:

    标签: templates c++14 variadic-templates template-meta-programming sfinae


    【解决方案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
     };
    

    通过这种方式,您可以在算法(algo0algoS...)内部创建一个非值type,即std::integer_sequence&lt;char, Ds...&gt;(其中Ds... 是修改后的char 序列)和(递归?)调用以下safe_implicit_cast成为

    safe_implicit_cast<typename algo0<Cs...>::type>
    

    第二个。

    我完全不明白你的第二个问题,因为我不知道f() 是什么,我不明白你为什么要写

    safe_implicit_cast<algo0<Cs...>::value::value<algoS...>
    

    第一个valueintfloat

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

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

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

    【讨论】:

    • 第二个问题确实是在尝试完成递归,以便使用所有算法。
    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 2017-03-18
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多