首页 > 解决方案 > 使用模板在类中声明新函数

问题描述

我还在学习模板。我不确定您是否可以使用模板在类(方法)中声明/(自动定义)一个函数。也就是说,我有一个这样定义的函数模板,例如:

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()(如果它是模板函数的完美复制粘贴)。

标签: c++classtemplates

解决方案


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();
         }

};

推荐阅读