już wiem, że można włączyć (lub nie) metodę klasy Korzystanie std::enable_if
umożliwić państwom klasę w zależności od szablonu
dla exemple:
template<size_t D, size_t E>
class Field
{
...
size_t offset(const std::array<float,D>& p) const
{
...
}
template<typename TT = size_t>
typename std::enable_if<D!=E, TT>::type
offset(const std::array<float,E>& p) const
{
return offset(_projection(p));
}
...
};
To nie pomaga będąc w stanie funkcjonować, że są nieważne zadzwonić w konkretnym przypadku, a także usuwanie błędów przeciążania ... co dla mnie jest bardzo miłe!
Chciałbym pójść dalej i sprawić, że niektórzy członkowie mojej klasy będą obecni tylko wtedy, gdy będą potrzebni. W ten sposób będę się błąd, gdy próbuję użyć sprzeciwił który byłby inaczej nie zostało wszczęte
Próbowałem zrobić
template<size_t D, size_t E>
class Field
{
...
template<typename TT = projectionFunc>
typename std::enable_if<D!=E, TT>::type _projection;
}
ale kompilator mówi mi:
erreur: data member ‘_projection’ cannot be a member template
Czy czy istnieje jakiś sposób osiągnięcia tego, czego chcę?
Możesz chcieć zmienić nazwę z 'offsetof', aby ktoś nie zawarł przed nagłówkiem i nie zaangażował się w to makro. –
chris
To jest planowane, szukam po prostu innej fajnej nazwy. – Amxx
Ta konkretna SFINAE też jest trochę ... icky. W przypadku 'D == E' kończysz na' typename std :: enable_if :: type'. Specjalizującą się cechą standardowej biblioteki jest UB, więc można argumentować, że hipotetyczna implementacja może odwoływać się do reguły "brak ważnej specjalizacji można wygenerować" i nazwać to źle sformułowanym. –