c++ - 是否可以在 C++ 中有一个“通用”模板参数,它可以是非类型模板参数或类型?
问题描述
在 C++ 中,可以使用类型作为模板参数,例如:
template <typename T>
void MyFn();
在某些情况下,也可以使用非类型作为模板参数,例如:
template <int64_t T>
void MyFn2();
我的问题是是否有可能同时拥有一个“通用”模板参数?喜欢:
template <TypenameOrint64_t T>
void MyFn3();
这样两者MyFn3<42>
都MyFn3<double>
可以接受。
我如何使用它的一个例子:
template <typename ValType, ValType Head, ValType ...Tail>
struct ListS{
template <typename OutType, template <ValType ArgType> class Fn>
using MapHead = ListS<OutType, Fn<Head>::val, Tail...>;
};
template<int64_t N>
struct SquareS{
static constexpr const int64_t val = N * N;
};
using Sqrd = ListS<int64_t, 3, 4>::MapHead<int64_t, SquareS>;
static_assert(std::is_same<Sqrd, ListS<int64_t, 9, 4>>::value, "Values don't match");
上面是一个非常粗略的编译时值列表及其上的单个编译时“函数”的草图。是否有可能使类似的东西也支持类型列表,而不仅仅是非类型模板参数兼容值的列表,而不仅仅是复制所有代码?
解决方案
在 C++ 中是否可以有一个“通用”模板参数,它可以是非类型模板参数或类型?
简短的回答:没有。
长答案。
不,我能想象到的最好的混合类型和值的方法是将值包装在类型中,std::integral_constant
例如使用 .
所以,你想要的代码,几乎可以写成(C++17)如下
#include <utility>
template <typename ...>
struct ListS;
template <typename ValType, ValType Head, ValType ...Tail>
struct ListS<std::integral_constant<ValType, Head>,
std::integral_constant<ValType, Tail>...>
{
template <template <auto> class Fn, typename OutType = ValType>
using MapHead = ListS<std::integral_constant<OutType, Fn<Head>::value>,
std::integral_constant<OutType, Tail>...>;
};
template <auto N>
struct SquareS : public std::integral_constant<decltype(N), N*N>
{ };
int main ()
{
using T1 = ListS<std::integral_constant<long long, 3ll>,
std::integral_constant<long long, 4ll>>;
using T2 = T1::MapHead<SquareS>;
using T3 = ListS<std::integral_constant<long long, 9ll>,
std::integral_constant<long long, 4ll>>;
static_assert( std::is_same_v<T2, T3> );
}
Pre C++17 你不能使用auto
模板值的类型,所以你应该做一些简单的更正。
推荐阅读
- java - Spring Boot - @SQSListener 和 @SpyBean 没有一起工作?
- c++ - c++ 在调用其构造函数之前访问静态/全局对象的成员是否有效?
- javascript - 修改一个 PrimeReact 模块
- javascript - 使用 addEventListener 覆盖模块中的属性的问题
- wordpress - 使用 user_register 挂钩中的自定义元值更新 WooCommerce billing_phone
- c# - 用于优化 Skip() Take() 的 LINQ 扩展
- c# - 选择所有列并返回 EF Core、.NET Core 中的给定类型
- multithreading - 如何在线程之间共享变量或以其他方式处理此逻辑?
- html - 应用边框顶部效果
- sql - sqflite 在再次创建已删除的表时没有此类表错误