通过显式 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
};
通过这种方式,您可以在算法 (algo0
、algoS...
) 中创建一个 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...>
其中第一个 value
是 int
或 float
也许您的意思是使用其他 algos...
递归调用 value
?
也许如下(注意:未测试)?
safe_implicit_cast<typename algo0<Cs...>::type>::template value<algoS...>
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
};
通过这种方式,您可以在算法 (algo0
、algoS...
) 中创建一个 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...>
其中第一个 value
是 int
或 float
也许您的意思是使用其他 algos...
递归调用 value
?
也许如下(注意:未测试)?
safe_implicit_cast<typename algo0<Cs...>::type>::template value<algoS...>