Как указать аргументы шаблона для шаблонных операторов - PullRequest
1 голос
/ 29 марта 2020

У меня есть шаблонный оператор в качестве члена класса:

struct A {
  template <bool s=true> auto operator[](int ) {}
};

Я указываю параметр шаблона следующим (довольно хитрым) способом:

int main() {
  A s;
  s.template operator[]<false>(1);
}

Этот тип уничтожает «красота» использования оператора (за исключением того факта, что, вероятно, не рекомендуется использовать шаблонные операторы; я использую его в своем коде для получения условно-константного возвращаемого типа без повторной реализации logi c и использования шаблон только внутри реализации at).

Существует ли более сжатая запись для указания аргумента шаблона?

1 Ответ

1 голос
/ 29 марта 2020

Вы можете заключить переданный параметр в класс шаблона, который вы можете вывести, например, диспетчеризацию тегов:

template<bool s>
struct A_index {  // A shorter name based on your use case
    int i;
};

struct A {
    template<bool s> auto operator[](A_index<s> i_) {
        int i = i_.i;
        // Use `i`
    }
    auto operator[](int i) { (*this)[A_index<true>{ i }]; }  // For your default = true
};

int main() {
    A s;
    s[A_index<false>{1}];

    using t = A_index<true>;
    s[t{0}];
}

Или вы можете иметь вспомогательную структуру шаблона, которая имеет ссылку A&, где Структура имеет параметры шаблона:

struct A {
};

template<bool s = true>
struct A_index {
    A& a;

    auto operator[](int i) { }
};

int main() {
  A s;
  A_index<false> view{ s };
  view[1];
}

Или вы можете просто использовать неоператорные функции-члены.

...