Допустим, у меня есть следующая структура MyPairType
.
template<typename F, typename S>
struct MyPairType {
F first;
S second;
MyPairType() { }
MyPairType(F f, S s) { first = f; second = s; }
operator F() const { return first; }
operator S() const { return second; }
};
Когда я пытаюсь использовать MyPairType<A, B>
(для любых типов A
и B
st A != B
), он работает нормально.Однако, когда я пытаюсь использовать MyPairType<T, T>
(для любого типа T
), происходит сбой, потому что два оператора преобразования одинаковы:
error: ‘MyPairType<F, S>::operator S() const [with F = int; S = int]’ cannot be overloaded
operator S() const { return second; }
^
error: with ‘MyPairType<F, S>::operator F() const [with F = int; S = int]’
operator F() const { return first; }
Я обнаружил, что это можно исправить с помощью комбинации std::enable_if
и std::is_same
, но для этого потребуется шаблонирование операторской функции, что нежелательно.
Допустим, у меня есть следующий код:
typedef int T1;
typedef int T2;
...
MyPairType<T1, T2> my_pair(3, 5);
T1 frst = my_pair;
T2 scnd = my_pair;
std::cout << frst << " " << scnd << std::endl;
Для приведенного выше кода я хочу, чтобы на выходе было 3 5
.Может ли преобразование происходить по-разному для T1
и T2
, даже если они оба int
?Как мне этого добиться?