如何专门化模板包
How to specialize template pack?
本文关键字:专门化 更新时间:2023-10-16
我有以下代码,它尝试将二进制数(作为布尔值列表传递,最低有效的第一个,可变长度)转换为十进制数:
#include <iostream>
using namespace std;
template<typename T>
int bin_to_dec(int multi, T first) {
cout<<"mutli"<<multi<<endl;
return first?multi:0;
}
template<typename T, typename... Args>
int bin_to_dec(int multi, T first, Args... args) {
cout<<"mutli"<<multi<<endl;
return (first?multi:0) + adder(multi*2, args...);
}
template<typename T, typename... Args>
int bin_to_dec(T first, Args... args) {
cout<<"mutli"<<1<<endl;
return (first?1:0) + adder(2, args...);
}
int main()
{
cout<<bin_to_dec(true, true, false, true)<<endl;
}
它运行得很好,但我想只为布尔值提供它,所以当我尝试类似 bin_to_dec(1,2,3) 的东西时,它不应该编译。我试图使用类似的东西
template<bool First, bool... Bools>
但我不知道如何走得更远。有什么想法吗?
显而易见的方法是从所有模板参数的重载集中删除该函数,但bool
:
template <typename... T>
std::enable_if_t<variadic_and(std::is_same<T, bool>::value...), int>
bin_to_dec(T... bits) {
// probably delegate to differently named functions as an implementation detail
// ...
}
如果variadic_and()
所有参数都true
,则返回true
constexpr
函数:
constexpr bool variadic_and() { return true; }
template <typename... T>
constexpr bool variadic_and(bool v, T... vs) {
return v && variadic_and(vs...);
}
使用 C++17 variadic_and()
是必要的,因为可以使用运算符扩展参数包。例如,variadic_and()
的实现可能如下所示:
template <typename... T>
constexpr bool variadic_and(T... vs) { return (vs && ...); }
同样的方法可以直接在std::enable_if_t<...>
中使用。
注意:上面使用的方法要求参数推导为bool
,即它们几乎需要是bool
类型。由于该函数不应该使用int
参数进行调用,并且这些参数会转换为bool
,因此测试参数类型是否可以转换为bool
似乎不合适。但是,允许某些转换可能是合理的。如果是这样,将在第一个参数中使用相应的特征来std::enable_if_t
。
只需使用静态断言。这非常有效:
int bin_to_dec() {
return 0;
}
template<typename T, typename ... Args>
int bin_to_dec(T first, Args ... rest)
{
static_assert(std::is_same<bool, T>::value, "Only valid for bools");
return (first ? 1 : 0) + (bin_to_dec(rest...) << 1);
}
int main()
{
cout<<bin_to_dec(true, true, false, true)<<endl;
cout<<bin_to_dec(1, 2, 3)<<endl; //compile error
}
相关文章:
- 是否可以对零模板参数进行模板专门化
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 输入两个不专门化大小的矩阵
- 如何在模板类中专门化赋值运算符?
- 如何专门化容器和枚举的模板
- Clang拒绝类模板的嵌套类仅通过专门化定义的代码是正确的吗
- 取消专门化C++模板参数
- SFINAE的变分变量模板专门化
- 如何在编译时专门化大型模板函数中的小部分
- 如何在c++运算符()中专门化调用模板
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何专门化字符串数组的模板?
- 如何专门化模板
- 如何避免为模板化迭代器的每个可能的实例化专门化iterator_traits?