Czy obiekt może znać swoją własną konstelację?
Zdecltype
istd::is_const
stałość zmiennej można wykryć zewnętrznie.Ale czy jest także możliwe, aby obiekt znał swoją własną konstelację? Użycie powinno być jak:
#include <type_traits>
#include <iostream>
#include <ios>
struct Test
{
Test() {}
bool print() const
{
// does not work as is explained in https://stackoverflow.com/q/9890218/819272
return std::is_const<decltype(*this)>::value; // <--- what will work??
}
};
int main()
{
Test t;
const Test s;
// external constness test
std::cout << std::boolalpha << std::is_const<decltype(t)>::value << "\n";
std::cout << std::boolalpha << std::is_const<decltype(s)>::value << "\n";
// internal constness test
std::cout << std::boolalpha << t.print() << "\n";
std::cout << std::boolalpha << s.print() << "\n"; // <--- false??
}
Wyjście włączoneLiveWorkSpace Czy to możliwe?
MOTYWACJA: Chcę być w stanie wykryć, czy stała funkcja składowa jest wywoływana na obiekcie stałym lub pochodzi z obiektu innego niż stały. Obiekt może np. reprezentują pamięć podręczną, a członek widok. Gdyby pamięć podręczna była stała, można przypuszczalnie użyć zoptymalizowanej procedury rysowania, natomiast jeśli dane bazowe nie były stałe, procedura rysowania musiałaby okresowo sprawdzać, czy dane zostały odświeżone.
UWAGA: powiązanepytanie pyta, jak złamać kompilację dla obiektów const, ale nie do końca rozumiem, czy odpowiedź na to sugeruje NIE dla mojego pytania. Jeśli nie, chcę przechwycić stałą w logice do dalszego użycia.
EDYTOWAĆ: jak wskazano @DanielFrey, konstruktor nie jest dobrym miejscem do testowania zgodności. Co ze stałą funkcją składową?
AKTUALIZACJA: Dziękuję wszystkim za poprawienie mojego początkowo złego pytania i dostarczenie różnych części odpowiedzi (źle zdefiniowana konstytucja, przewartościowaniethis
, znaczenie kontekstoweconst
, z - oczywistym przeciążeniem - oczywistym przeciążeniem, które przeoczyłem, i stałą referencyjną luką aliasingową czającą się w cieniu). Dla mnie to pytanie było Stackoverflow w najlepszym wydaniu. Postanowiłem wybrać odpowiedź @ JonathanWakely, ponieważ pokazała, jak to zdefiniowaćMutable
iImmutable
zajęcia, które wzmacniają koncepcję konstytucji, aby osiągnąć to, czego chcę, w niezawodny sposób.