通过显式类

时间:2018-08-03 10:42:57

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

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:第二个问题试图完成递归,以便使用所有可用的算法。

1 个答案:

答案 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
 };

通过这种方法,您可以在算法(typealgo0)内创建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...>

其中第一个valueintfloat

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

也许如下所示(警告:未经测试)?

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