Имя экземпляра функции шаблона элемента класса - PullRequest
2 голосов
/ 11 декабря 2019

Рассмотрим этот код, который, очевидно, не работает, но иллюстрирует, что я хочу сделать.

struct C {
   template <int I>
   void f(float x) {...}
...
   using one = f<1>;
   using two = f<2>;
};

C c;
c.one(4.0f);
c.two(77.0f);

В моем классе есть 10 функций-членов, которые могут принимать 2 значения, а не тип, параметры шаблона и я. хочу дать им разные имена, чтобы пользователю не приходилось вводить параметры шаблона. Это иллюстрируется one и two выше.

Есть идеи, как это сделать с C ++ 17 или даже с C ++ 20?

Обновление:

Хороший ответ ниже, но, как уже упоминалось, немного многословно. Я пытаюсь избежать:

void one(float v) { 
   f<1>(v); 
   } 

, хотя мои фактические утверждения будут немного длиннее.

Надеялся, что-то сжатое было доступно.

Ответы [ 2 ]

3 голосов
/ 11 декабря 2019

Вы не можете использовать псевдонимы для функций-членов напрямую. Но вы можете написать обертки, которые пересылают их:

template<typename... Args>
decltype(auto) one(Args&& ...args) { return f<1>((Args&&)args...); }

template<typename... Args>
decltype(auto) two(Args&& ...args) { return f<2>((Args&&)args...); }

Вот оно, живое

Немного многословно для написания, но обеспечивает простоту, которую вы хотите дляклиент-программист.

2 голосов
/ 11 декабря 2019

Если вы согласны вызывать one и two с немного другим синтаксисом

(c.*one)(4.0f);
(c.*two)(77.0f);

, вы можете объявить one и two как (постоянные, если хотите) указатели на методыиз C.

Я имею в виду ... снаружи C вы можете написать

using mftype = void(C::*)(float);

constexpr mftype one = &C::f<1>;
constexpr mftype two = &C::f<2>;

Ниже приведен полный пример компиляции

#include <iostream>

struct C
 {
   template <int I>
   void f (float x)
    { std::cout << (x+I) << std::endl; }
 };

using mftype = void(C::*)(float);

constexpr mftype one = &C::f<1>;
constexpr mftype two = &C::f<2>;

int main ()
 {
   C c;

   (c.*one)(4.0f);
   (c.*two)(77.0f);
 }
...