Estou tentando implementar o modelo usando uma função globalmente sobrecarregada para executar ações personalizadas por assinatura. Como pode haver um grupo de tipos (por exemplo, tipos numéricos) com uma implementação semelhante, tentei usar conceitos para cobri-lo, mas tropecei no problema em que o compilador não vê a definição com conceito sem instanciação explícita.
MSVC 17.13.0 (/std:c++latest)
// my.hpp
template <typename value_type>
void bar(value_type value);
template <typename value_type>
void foo(value_type value)
{
bar<value_type>(value);
}
// my.cpp
#include "my.hpp"
#include <print>
#include <type_traits>
template<std::integral value_type>
void bar(value_type value)
{
std::println("bar(integral[{}])", value);
}
int main()
{
//bar(5);
foo(6);
}
O programa acima não é compilado porque o vinculador não vê bar
a definição de :
símbolo externo não resolvido "void __cdecl bar(int)" (??$bar@H@@YAXH@Z) referenciado na função "void __cdecl foo(int)" (??$foo@H@@YAXH@Z)
Porém, se eu descomentar a linha bar(5);
em main()
, isso obviamente instanciará o modelo restrito ao conceito, e o resultado será adequado (mas com saída extra da chamada direta bar(5)
):
barra(integral[5])
barra(integral[6])
Existe um padrão comum para resolver tal tarefa? Basicamente, eu quero que o template que recebe o tipo seja capaz de encontrar a definição adequada da função template em si, void bar<int>
no meu caso.