Estou testando modelos e conceitos em C++. Escrevi o seguinte código.
#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;
}
O compilador reconhece com sucesso que myStruct_t
satisfaz Printable
o conceito, mas falha em corresponder int
com Printable
o conceito. Gostaria de saber como posso informar ao compilador que o int
também é Printable
.
Pesquisei na internet e descobri que o compilador encontra a to_string
função necessária para Printable
o conceito por meio de pesquisa dependente de argumento (ADL). Como int
não está sujeito a ADL, o compilador falha em reconhecer a função ao tentar fazer check- int
in Printable
. Gostaria de saber se não há como fazer int
Printable
.
Usando gcc
-fconcepts-diagnostics-depth=2
vemos:Isso significa que o conceito não é satisfeito para
int
, porque no ponto da definição do conceito a funçãoto_string(int)
ainda não foi declarada.Você pode mover a implementação do
to_string(int)
conceito acima ou adicionar uma declaração de encaminhamento ali.