我正在尝试 C++ 中的模板和概念。我写了以下代码。
#include <iostream>
#include <string>
template <typename T>
concept Printable = requires(T a) {
{ to_string(a) } -> std::same_as<std::string>;
};
typedef struct myStruct {
std::string name;
} myStruct_t;
// Implement to_string for myStruct_t
std::string to_string(myStruct_t arg) {
return arg.name;
}
// Implement to_string for int
std::string to_string(int arg) {
return "it's an integer";
}
// a function that requires Printable
template <typename T>
requires Printable<T>
void show(T arg) {
std::cout << to_string(arg) << std::endl;
}
int main(){
myStruct_t a = {"hello"};
show(a); // passes compilation
show(5); // error: no matching function for call to ‘show(int)’
// note: the required expression ‘to_string(a)’ is invalid
return 0;
}
编译器成功识别出myStruct_t
满足concept 但无法与conceptPrintable
匹配。我想知道如何才能通知编译器也是。int
Printable
int
Printable
我在网上搜索了一下,发现编译器是通过参数相关查找(ADL)来找到conceptto_string
所需的函数的。由于不受ADL约束,因此编译器在尝试签入时无法识别该函数。我想知道是否没有办法。Printable
int
int
Printable
int
Printable