Ho una funzione modello che desidero abilitare solo per contenitori standard (o contenitori compatibili con contenitori standard, che forniscono almeno una funzione membro begin()
). Sto SFINAE-ing out non-container nel seguente modo:Come disattivare i parametri non contenitori di SFINAE
template<typename Container>
typename Container::value_type
f(const Container& c,
typename std::enable_if<
std::is_same<
decltype(*c.begin()),
typename Container::value_type
>::value
>::type* = nullptr)
{
// implementation here
}
Il std::is_same
e decltype
non guardare troppo elegante. C'è un modo migliore per farlo?
PS: bisogno di SFINAE qui perché ho un sovraccarico diverso
template<typename Derived>
f(const Eigen::MatrixBase<Derived>& A)
e ogni volta che provo f(some_Eigen_matrix)
, il sovraccarico Container
finisce per essere raccolto, il compilatore sputa fuori un errore perché il tipo è carente begin()
.
Perché stai facendo il controllo di uguaglianza, comunque? Non è sufficiente se l'espressione è valida? – Columbo
'auto f (const Container & c) -> decltype (c.begin(), (void) c.end())' –
Ok, è un po 'più disordinato. Il tipo restituito è una somma sugli elementi del contenitore. – vsoftco