C'è un modo per verificare se class
ha un typedef
che funziona anche per private
typedef
?Tratto che controlla se la classe ha typedef (privato o altro) o meno
Seguendo codice funziona in VS2013, ma non riesce a ideone's gcc
template<typename T>
struct to_void
{
typedef void type;
};
class Foo
{
typedef int TD;
};
template <typename T, typename dummy = void>
struct has_TD : std::false_type {};
template <typename T>
struct has_TD<T, typename to_void<typename T::TD>::type > : std::true_type{};
int main()
{
std::cout << std::boolalpha << has_TD<Foo>::value << std::endl;
}
modifica - perché voglio questo
ho sistema di serializzazione personalizzata, che può serializzare tipo arbitrario. Ha diversi sovraccarichi quando deve comportarsi in modo diverso (ad esempio stringa). Per il resto dei tipi, scrive semplicemente il valore nella memoria. Se ho composto il tipo, a volte posso anche solo scrivere in memoria (salva il carico & sulla stessa architettura, compilato con lo stesso compilatore, quindi gli paddings saranno gli stessi, ecc.). Questo metodo è valido ad esempio per i tipi di POD (tratto std::is_pod
), ma tutti i tipi di POD è solo un sottoinsieme di tutti i tipi, supportando questa serializzazione.
Quindi ho fondamentalmente la funzione di modello write<T>
che basta scrivere sizeof(T)
byte (serializzazione raw) ... Ma non voglio che questo venga chiamato per errore, voglio utente, per dire esplicitamente nella loro classe: "questo class/struct può essere serial-serializzato "). Il modo in cui lo faccio è una macro ALLOW_RAW_SERIALIZE
che definisce alcuni typedef che possono essere controllati tramite tratto. Se la classe MyClass
non contiene typedef, chiamando write(myClassInstance)
si verificherà un errore del compilatore.
Le cose che fondamentalmente decidono se la classe può essere serializzata in modo raw sono i suoi membri (senza riflessione, i membri non possono essere enumerati e controllati automaticamente, quindi l'utente deve fornire tali informazioni). classe tipica assomiglia a questo:
class
public
ctor-dtor
methods
private
methods
members
e voglio gli utenti per consentire scrittura ALLOW_RAW_SERIALIZE
il più vicino ai membri più possibile, in modo che quando cambiano alcuni membri v'è una probabilità minore di dimenticato di aggiornare ALLOW_RAW_SERIALIZE
(rimuoverla quando. non è più valida è)
Ecco perché voglio verificare un private typedef
Dal momento che è sostituto per la riflessione e prende tutto il tipo e scrivere, io non caduto su di esso come rompere l'incapsulamento o giù di lì ..
perché il downvote? – relaxxx
Questo non sembra possibile. Il comportamento VS sembra un insetto. –
Solo curioso: quale sarebbe il punto di sapere che c'è un typedef che non puoi usare? Se fosse possibile, interromperà l'incapsulamento in quanto le modifiche ai dettagli di implementazione privati influenzano il codice del client nonostante l'API pubblica sia stabile. –