C ++ определяет функции на основе типов шаблонов - PullRequest
0 голосов
/ 21 ноября 2018

Допустим, у меня есть следующая структура 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?Как мне этого добиться?

1 Ответ

0 голосов
/ 21 ноября 2018

Создайте специализацию для случая, когда они одинаковы.Примечание. Чтобы избежать этого, вы можете захотеть сделать то, что делает стандартная библиотека, и предоставить методы для доступа к первому и второму элементу, а не предоставить метод приведения.Таким образом, даже если типы одинаковы, методы разные, поэтому нет перегрузки.

В любом случае вы можете специализироваться, добавив это после исходного определения,

template<typename F>
struct MyPairType<F, F> {
  F first;                                                                           
  F second;                                                                        
  MyPairType() { }
  MyPairType(F f, F s) { first = f; second = s; }
  operator F() const { return first; }
};

Кроме того, вы создаетенеправильно названы.VPairType -> MyPairType.

РЕДАКТИРОВАТЬ: только что понял, что таким образом вы никогда не сможете получить доступ ко второму элементу путем приведения.Вы должны просто предоставить F first() и F second() метод

...