Desidero selezionare l'implementazione di una funzione membro (costruttore di copie) basata su un valore di argomento del modello. Suppongo che ci siano due approcci: SFINAE e specializzazione parziale del modello.selezionando il costruttore di copia appropriato in base ai parametri del modello
L'ultimo presunto assomiglia a questo:
#include <iostream>
template<typename A, bool sw>
struct B
{
B() {}
B(const B &b);
};
template<typename A>
B<A, false>::B(const B<A, false> &b)
{
std::cout << "false\n";
}
template<typename A>
B<A, true>::B(const B<A, true> &b)
{
std::cout << "true\n";
}
int main()
{
}
Esso non può essere compilato: nested name specifier 'B<A, false>::' for declaration does not refer into a class, class template or class template partial specialization
.
approccio SFINAE non troppo:
#include <type_traits>
#include <iostream>
template<typename A, bool sw>
struct B
{
B() {}
template<typename U = typename std::enable_if<sw, B>::type>
B(const U &b)
{
std::cout << "true\n";
}
template<typename U = typename std::enable_if<!sw, B>::type>
B(const U &b)
{
std::cout << "false\n";
}
};
int main()
{
{
B<int, true> b;
auto bc = b; // cout << true
}
{
B<int, false> b;
auto bc = b; // cout << false
}
}
l'errore di compilazione qui è constructor cannot be redeclared
e no type named 'type' in 'std::enable_if<false, B<int, false> >'; 'enable_if' cannot be used to disable this declaration
.
C'è un modo per risolvere i problemi o altrimenti selezionare il costruttore di copia appropriato in base ai parametri del modello?
non si può fare la specializzazione parziale solo membri di una classe (o struttura) , è necessario specializzare parzialmente la classe completa. –
per il record, uno dei problemi qui è che non si può avere un costruttore di copia basato su modelli (eccetto il fatto che le due firme sono le stesse nel tuo caso, questo può essere risolto), perché una copia implicitamente generata il costruttore vince sempre nella risoluzione di sovraccarico –