Operando sotto la regola del "non c'è mai nulla di nuovo sotto il sole," Dubito che io sono la prima persona a venire con questo trucco. Ho pensato che mi sarei imbattuto in qualcosa di online documentandolo alla fine, ma non l'ho ancora fatto, quindi ho pensato che avrei chiesto.Questo modello SFINAE ha un nome?
Il suo scopo è abilitare selettivamente alcune funzioni a condizione che siano rilevanti, senza utilizzare una classe derivata.
Esiste un nome per questo motivo? E qualcuno ha qualche informazione utile su questo modello o su un modello che funziona in modo simile?
template<typename T, size_t N>
class Point {
public:
template<size_t P, typename T2=void>
using Enable2D = typename std::enable_if<P == 2 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable3D = typename std::enable_if<P == 3 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable4D = typename std::enable_if<P == 4 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable2DOrHigher = typename std::enable_if<P >= 2 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable3DOrHigher = typename std::enable_if<P >= 3 && N == P, T2>::type;
template<size_t P, typename T2=void>
using Enable4DOrHigher = typename std::enable_if<P >= 4 && N == P, T2>::type;
//Example use cases
template<size_t P=N>
static Enable2D<P, Point> withAngle(T angle, T magnitude = 1);
template<size_t P=N>
static Enable3D<P, Point> fromAngles(T psi, T theta, T magnitude = 1);
template<size_t P=N>
Enable2DOrHigher<P, T> const& x() const;
template<size_t P=N>
Enable2DOrHigher<P, T> const& y() const;
template<size_t P=N>
Enable2DOrHigher<P> setX(T const& t);
template<size_t P=N>
Enable2DOrHigher<P> setY(T const& t);
template<size_t P=N>
Enable3DOrHigher<P, T> const& z() const;
template<size_t P=N>
Enable3DOrHigher<P> setZ(T const& t);
template<size_t P=N>
Enable4DOrHigher<P, T> const& w() const;
template<size_t P=N>
Enable4DOrHigher<P> setW(T const& t);
};
È un'idea interessante, in pratica parametrizza i puntatori funzione membro. In javascript, è possibile creare l'oggetto "prototipo" e quindi creare condizionatamente determinate funzioni membro. Non ho visto nulla di simile in C++. Curioso di vedere le risposte ... –
Il caso d'uso motivante per questo era che avevamo anche classi di box e linee multidimensionali che prendevano un punto standard, ma avevamo precedenti classi derivate per point2 e point3, quindi l'utile punto 2d e 3d le funzioni non erano accessibili sia alle classi stesse (a meno che non ne dovessimo ricavare anche quelle, nel qual caso sarebbe una reimplementazione perché i membri erano cambiati e c'era molto codice comune, DRY), ma anche a qualsiasi parte di codice che utilizzava gli algoritmi di casella e linea. Quindi abbiamo ritenuto che l'uso di SFINAE fosse più pulito, anche se rendeva le funzioni esposte leggermente incoerenti. – OmnipotentEntity
Perché l'uso ripetuto di 'enable_if' può diventare un pattern? Questa è una tipica applicazione di 'enable_if' - ad es. consideri [descrizione di cppreference] (http://en.cppreference.com/w/cpp/types/enable_if) "* rimuovi condizionatamente funzioni e classi dalla risoluzione di sovraccarico basata sui tratti del tipo e per fornire overload e specializzazioni di funzioni separate per tratti di tipo diverso * "... sembra comprendere ciò che hai fatto del tutto adeguatamente. –