C++20概念是否允许将模板函数作为模板参数问题进行修复
Do C++20 concepts enable fixing template function as template argument problem?
如果你在C++20中尝试一些相对简单的东西,它会因无用的错误消息垃圾邮件而崩溃。
int main() {
auto as = std::vector{1,3,24,};
auto bs = std::vector{1,4,10};
auto cs = std::vector<float>{};
std::ranges::transform(as, bs, std::back_inserter(cs), std::max);
std::ranges::copy(cs, std::ostream_iterator<float>(std::cout, " "));
}
原因是std::max
是模板化的函数,所以它不起作用。通过将参数设置为lambda或创建一个小的helper函子,可以很容易地解决这一问题。
但我想知道C++概念是否可以用来告诉我们想要什么样的模板实例化?例如,我们破解了一些requires语句,该语句指出,如果函子参数是模板,那么该函子的模板参数必须与容器value_type
匹配。
我怀疑这是可能的,因为我认为在模板重载解析和约束检查开始之前,必须知道函子的确切类型,换句话说;反向传播";从概念到调用站点的信息。
但我不确定,所以我决定问。
如果你想知道我试过什么,这是我的代码,但它很坏,我无法编写模板模板参数代码。。。
但无论如何,我希望它能说明这个想法。。。
template<typename C, typename F>
struct xtransform
{
xtransform(C& c, F f) : c_(c), f_(f){}
void operator()(){
}
C c_;
F f_;
};
template<typename C, template<typename> typename F, typename FArg>
requires requires {
std::is_same_v<typename C::value_type, FArg>;
}
struct xtransform<C, F<FArg>>
{
xtransform(C& c, F<FArg> f) : c_(c), f_(f){}
void operator()(C& c, F<FArg> f){
}
C c_;
F<FArg> f_;
};
否。
std::max
命名了一个模板函数。模板参数列表不完整的模板函数名称在重载解析过程中会转换为函数。重载解析需要将函数名转换为指向固定签名的指针,或者使用()
s调用
概念没有帮助。
现在你可以用一个老把戏了;在非推导上下文中使用函数指针的函数重载。当我编写类似手动滚动std函数的类型时,正是出于这个原因,我添加了R(*)(Args...)
重载;当存在类型完全匹配的重载时,允许进行重载解析。
但这不是基于概念的。
相关文章:
- C++转换参数初始化问题
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 标准::enable_if 和标准::is_arithmetic 作为模板参数的问题
- enable_if中参数包的大小问题
- 构造函数 (C++) 中的 char 指针参数存在问题
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- C++复杂情况的比较器通过参数问题
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 模板<类型名称...参数>的问题
- C++17 中的歧义错误(模板模板参数和默认参数问题)
- constexpr 运算符重载使用参数的问题
- 通过命令行参数获取llvm ir文件时面临问题
- 函数中使用的函数指针的参数的问题
- 我在生成返回为数不多的模板化参数之一cpp的函数时遇到问题
- 从命令行获取参数时出现问题
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- C++:关于for语句和参数的一般问题
- 字符串打印机问题:参数 X 没有从“char (*)[xx]”到“char**”的已知转换