Czy istnieje sposób kompilacji metody, czy nie, w zależności od argumentu szablonu? Próbuję utworzyć klasę współrzędnych, która może obsłużyć 2, 3 lub więcej wymiarów. Chcę zapewnić metody Acces jak x()
, y()
i z()
, ale chciałbym z()
sposób, aby były dostępne tylko wtedy, gdy wymiar jest większy niż 3. Na razie (jak widać poniżej), używam static_assert
celu zapobieżenia wykorzystywania z()
dla współrzędne wymiaru 2.Udostępnienie metody w zależności od argumentu o kompilacji
template<typename DataType, int Dimension>
class Coord
{
private:
std::array<DataType, Dimension> _data;
public:
// how to achieve some kind of compile_if()
DataType& z()
{
static_assert(Dimension >= 3, "Trying to access an undefined dimension.");
return _data[2];
}
};
Co chciałbym zrobić to ukryć istnienie z()
dla wymiaru 2, tak, że ten
Coord<int, 2> ci2(0,0);
ci2.z() = 3; // shouldn't compile
nie kompiluje bez użycia static_assert. Widziałem wiele pytań dotyczących std :: enable_if, ale z tego co rozumiem, należy włączyć lub wyłączyć określone przeciążenia.
Pytanie brzmi: czy istnieje sposób na udostępnienie metody w zależności od argumentu kompilacji?
bok: mam oznaczyć to jako C++ lub C++ 11? – undu
Prawdopodobny duplikat: http://stackoverflow.com/questions/6972368/stdenable-if-to-conditionally-compile-a-member-function?lq=1 – Synxis