c++ - 如何获得指向受概念限制的函数的函数指针?
问题描述
我有一个函数模板和一个概念的重载:
template<typename T> void f() {std::cout<< "general" << std::endl;}
template<std::integral T> void f() {std::cout<< "integral" << std::endl;}
现在我想获得一个指向该概念的函数的函数指针。当我使用辅助结构时它工作正常:
typedef void (*tF)();
template<typename T> struct H
{
static void g() {f<T>();}
};
tF fHd = &H<double>::g;
tF fHi = &H<int>::g;
当我在没有辅助结构的情况下直接执行时,例如
tF fd = &f<double>;
tF fi = &f<int>;
GCC 10 给出错误消息:
error: converting overloaded function ‘f’ to type ‘tF’ {aka ‘void (*)()’} is ambiguous
tF fi = &f<int>;
note: candidates are: ‘void f() [with T = int]’
template<typename T> void f() {std::cout<< "general" << std::endl;}
note: ‘void f() [with T = int]’
template<std::integral T> void f() {std::cout<< "integral" << std::endl;}
这是 GCC 中的错误还是标准要求的?
解决方案
现在看起来这可能是一个错误,要绕过它,您可以执行类似...
#include <type_traits>
#include <iostream>
template<typename T> void f() requires (!std::integral<T>) {std::cout<< "general" << std::endl;}
template<std::integral T> void f() {std::cout<< "integral" << std::endl;}
typedef void (*tF)();
int main() {
tF fd = &f<double>;
tF fi = &f<int>;
}
甚至
template<typename T> concept nonIntegral = !std::integral<T>;
template<nonIntegral T> void f() {std::cout<< "general" << std::endl;}
template<std::integral T> void f() {std::cout<< "integral" << std::endl;}
这应该可以正常工作。
推荐阅读
- php - 使用 phpadmin mysql 触发语法错误
- python - SQL/SqlAlchemy:查询依赖树中的所有对象
- string - Vue 指令 - 传入字符串
- crossfilter - D3 和交叉过滤器抛出错误
- python - 将 sav 转换为 pandas df 错过了最后一列
- regex - 正则表达式过滤电子表格中的 URL 列表
- c++ - 即使单词中有括号,如何在括号内选择完整的单词
- postgresql - pgr_createTopology() 函数中的参数作为查询
- angular - 清除“Angular4”中的文本框
- python - 从 IBM Watson Personal Insights - Python 获取更多信息