Modernes C++ programmieren

Okt 23, 2024

lst-0670-godb.cpp

//#(compile) c++; compiler:g132; options:-O3 -std=c++23; libs:-
// https://godbolt.org/z/Y6v6cKE3v 
#include <string>
#include <tuple>
#include <concepts>             // copyable, C++20
template <std::copyable T, std::copyable U=T> // allgemeiner Fall
class MyPair {
    T data01_;
    U data02_;
public:
    MyPair(const T& t, const U& u) : data01_{t}, data02_{u} {}
};
template <std::copyable T>      // teilweise Spezialisierung, T bleibt formal
class MyPair<T, std::string> {  // U ist auf string spezialisiert
    std::tuple<T,std::string> data_;
public:
    MyPair(const T& t, const std::string& str) : data_{t, str} { }
};
template <std::copyable U>      // teilweise Spezialisierung, U bleibt formal
class MyPair<std::string, U> {  // T ist auf string spezialisiert
    std::tuple<std::string, U> data_;
public:
    MyPair(const std::string& str, const U& u) : data_{str, u} { }
};
int main() {
  // nutzt partielle Spezialisierung
  MyPair<int,std::string> intString{1, "a"};
  MyPair<std::string,int> stringInt{"b", 2};

  MyPair<int,int> intInt{3,4};                     // nutzt allgemeinen Fall
  MyPair intInt2{3,4};                             // auch MyPair<int,int>
  MyPair<std::string,std::string> strStr{"c","d"}; //                                          (ERR)  mehrdeutig
}