Tenho a seguinte turma:
template<typename Population, typename... Operators> class GA
{
public:
template<typename Evaluator,
typename std::enable_if_t<
std::is_same_v<Evaluator, Evaluator<Operators...>>>>
void EvaluatePopulation(Evaluator& evaluator)
{
evaluator.Evaluate();
}
};
Isso não compila devido a EvaluatePopulation
uma declaração incorreta.
Como posso especificar que o EvaluatePopulation
método pode ser chamado somente com Evaluator
uma classe que foi inicializada com o mesmo Operators...
nome da GA
classe?
O truque é usar um parâmetro de modelo de modelo para que você “descompacte” os argumentos de modelo do avaliador para corresponder ao pacote do GA. Por exemplo, você pode escrever:
(( Veja demonstração ao vivo ))
Alternativamente, usando os conceitos do c++20 , que fornecem mensagens de erro mais claras:
(( Veja demonstração ao vivo ))