Angenommen, ich habe einige Strukturen und jedes von ihnen hält eine enum als Mitglied. Ich möchte ein Verfahren zur Herstellung einer Struktur nennen, aber je nach einem Mitglied Struktur, wie im Codeb.:Wie man Schablone durch das Mitglied der Struktur ableitet
#include <iostream>
#include <string>
#include <type_traits>
enum class Type{
lowercase = 0,
uppercase
};
struct Low{
static constexpr Type cp = Type::lowercase;
};
struct Up{
static constexpr Type cp = Type::uppercase;
};
template<typename Case, typename=void>
struct Printer
{
void print_g(const std::string& s){
std::cout << "just s: " << s << std::endl;
}
};
template<typename X>
struct Printer<X, std::enable_if_t<X::cp == Type::lowercase, void>>
{
void print_g(const std::string& s){
std::cout << "lowercase " << std::nouppercase << s << std::endl;
}
};
template<typename X>
struct Printer <X, std::enable_if_t<X::cp == Type::uppercase, void>>
{
void print_g(const std::string& s){
std::cout << "uppercase " << std::uppercase << s << std::endl;
}
};
int main()
{
Printer<Low> pl;
pl.print_g("hello1");
Printer<Up> p2;
p2.print_g("hello2");
}
Aber diese Lösung sieht nicht ganz elegant zu mir. Vor allem der Teil typname = void in der ersten Vorlage. Nur dann kompiliert Code. Warum ist das der Fall? Und gibt es eine bessere (elegantere) Lösung für diese Template-Spezialisierung?
Nizza :) Vielen Dank! – anicicn
Und gibt es C++ 14 Weg das zu tun? Da bin ich irgendwie mit Compiler-Version beschränkt. – anicicn
@anicicn: In Ihrem speziellen Fall können Sie eine normale "if" -Anweisung verwenden. –