gpt4 book ai didi

c++ - 如何专门化模板包?

转载 作者:行者123 更新时间:2023-11-28 00:02:49 26 4
gpt4 key购买 nike

我有以下代码,它试图将二进制数(作为 bool 值列表传递,最低有效优先,可变长度)转换为十进制数:

#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;
}

它工作得很好,但我想让它只适用于 bool 值,所以当我尝试像 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()将是 constexpr函数返回 true如果它的所有参数都是 true :

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 的第一个参数中使用相应的特征。 .

关于c++ - 如何专门化模板包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37633225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com