Объявите новую функцию внутри класса, используя шаблон - PullRequest
0 голосов
/ 26 марта 2019

Я все еще изучаю шаблоны. Я не уверен, что вы можете объявить / (автоматически определить) функцию внутри класса (метода), используя шаблон. То есть у меня есть такой шаблон функции, например:

template<typename T>
T getT() {
    T result;
    return result;
}

И класс, в котором я хочу, чтобы "новая функция" была создана на основе шаблона, например:

class World{
public:
    World();
    ~World();
    getT<int>; //"Magically" create new function from the template (return type 'int')

}

Что я на самом деле хочу, так это иметь только метод с определенным заданным типом в World. Это означает, что когда я хочу «волшебным образом» создать метод на основе шаблона, я хочу отсортировать и вставить функцию шаблона в класс, но с заданным типом.

Например:

class World{
public:
    World();
    ~World();

    //The magically created function with T equal to int
    int getT(){
        int result;
        return result;
    }

}

Тогда, конечно, я ожидаю, что смогу вызвать функцию:

int main(){
    World world; //Create world object
    world.getT<int>; //Call the function
    return 0;
}

Даже при том, что здесь я говорю, что я назвал бы это с getT<int>, это могло бы быть только getT() (если это идеальная копия-вставка функции шаблона).

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Будьте осторожны

template<typename T>
T& getT() {
    T result;
    return result;
}

Вернет ссылку на временный.Пожалуйста, сделайте

template<typename T>
T getT() {
    T result;
    return result;
}

без "&"

И если это просто для получения определенного члена, вы можете использовать std :: tuple.

https://en.cppreference.com/w/cpp/utility/tuple/get

0 голосов
/ 26 марта 2019
getT<int>; //"Magically" create new function from the template (return type 'int')

Не думаю, что это сработает.

Похоже, вы хотели бы иметь возможность использовать шаблоны, такие как расширение макроса.К сожалению, это очень разные вещи, и шаблоны не работают как макросы.

Однако вы можете использовать что-то вроде следующего:

template<typename T>
struct GetHelper
{
   T get()
   {
      return T{};
   }
};


class World : private GetHelper<int>,
              private GetHelper<double>
{
   public:
      World() {}
      ~World() {}
      template <typename T>
         get()
         {
            return static_cast<GetHelper<T>*>(this)->get();
         }

};

Теперь вы можете использовать:

World w;
int a = w.get<int>();
double b = w.get<double>();

Вы также можете скрыть GetHelper как private тип World как:

class World 
{
   private:
      template<typename T>
         struct GetHelper
         {
            T get()
            {
               return T{};
            }
         };

      struct Data : GetHelper<int>,
                    GetHelper<double>{};

      Data data;

   public:
      World() {}
      ~World() {}
      template <typename T>
         get()
         {
            return static_cast<GetHelper<T>*>(&data)->get();
         }

};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...