Valeur template par défaut pour des classes de politique
Bonjour à toutes et à tous,
J'essaie de décomposer une classes en politiques, et comme c'est la première fois que j'ai plus d'une politique à gérer, je ne sais pas bien m'y prendre. Ou disons plutôt que j'ai l'impression de vouloir faire très compliqué pour les cas les plus simples. Pourriez-vous m'aiguiller je vous prie ? :)
Par défaut, j'aimerais que le Prédicat unaire retourne true quelque soit la valeur de l'argument fourni. Est-ce qu'il faut que je code un foncteur bidon qui renvoie toujours true pour pouvoir le mettre en argument template par défaut ou il y a un truc du genre std::true<T>, ou bien tout simplement le type true fera l'affaire ? Est-ce que le compilateur va faire sauter le test conditionnel (je sens qu'on va me dire qu'il fera ce qu'il voudra ... ;) ) ?
D'autre part, pour le SpectrumHandler par défaut, j'aimerais que la fonction SpectrumHandler::handle(bar_type) de la politique par défaut renvoie directement le bar qui a été passé en argument (en gros, qu'elle ne fasse rien de particulier). Est ce qu'il faut que j'implémente une politique bidon qui retourne directement l'argument, où il y a t'il une manière plus explicite/concise de faire (une sorte de std::return_directly<T>) ?
Merci d'avance :)
EDIT : Des erreurs de compilation se sont glissées dans les lignes de code et sont corrigées par Pyramidev plus bas
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
template<class UnaryPredicate, class SpectrumHandler>
class OccupancySpectrumDistribution {
using spectrum_type = Algorithm::occupancy_spectrum_type;
using support_type = std::vector<spectrum_type>;
using probabilities_type = std::vector<double>;
support_type m_support;
probabilities_type m_probas;
mutable std::discrete_distribution<size_t> m_dist;
static auto make_callback(unsigned int k, unsigned int N, UnaryPredicate pred){
auto& s_ref = m_support;
auto& p_ref = m_probas;
return [s_ref, p_ref](spectrum_type const& M_j){
auto p = compute_probability(k, N, M_j);
if(pred(p)){
s_ref.push_back(SpectrumHandler::handle(M_j));
p_ref.push_back(p);
}
};
}
// ....
}; |