当前位置: 首页 > 知识库问答 >
问题:

C分解模板类的诱惑方法特化,这可能吗?

能帅
2023-03-14

我在模板类中有一个模板方法<我以前读过一篇文章,没有专门化这个类,就不能专门化一个方法<但是我想把这些方法中的一些分解,可能吗?

示例

class One {
public:
  static const int number = 1;
};

class Two {
public:
  static const int number = 2;
};    

template<typename num> class A  {
private:
  num n;

public:
  template<typename type>
  void multiplyBy(); // by 1 if <int> or 1,5 if <float>
}; // A

template<> template<> void A<One>::multiplyBy<int>() {
  std::cout << 1.0*n.number << std::endl;
}

template<> template<> void A<One>::multiplyBy<float>() {
  std::cout << 1.5*n.number << std::endl;
}

template<> template<> void A<Two>::multiplyBy<int>() {
  std::cout << 1.0*n.number << std::endl;
}

template<> template<> void A<Two>::multiplyBy<float>() {
  std::cout << 1.5*n.number << std::endl;
}

int main() {
  A<One> aOne;
  A<Two> aTwo;
  aOne.multiplyBy<int>();   // 1
  aOne.multiplyBy<float>(); // 1.5
  aTwo.multiplyBy<int>();   // 2
  aTwo.multiplyBy<float>(); // 3

  return 0;
}

一个与stackoverflow相关的问题:模板类内模板函数的C专门化
特别是这个注释:模板类内模板函数的C专门化

我必须扣除没有办法将multiplyBy()分解为整数和浮点数吗<英语不是我的自然语言,也许我错过了一些简单的东西,也许是一个局部专业化的解决方法。

编辑:把A::n在私人匹配更好我的问题。

共有2个答案

澹台蕴藉
2023-03-14

但是我想分解一些方法,可能吗?

你可能知道你不能使用:

template<> template<> void A<One>::multiplyBy<int>() {
  std::cout << 1.0*n.number << std::endl;
}

你可以做以下几点:

#include <iostream>

class One {
public:
  static const int number = 1;
};

class Two {
public:
  static const int number = 2;
};    

template<typename num, typename type = int> struct MultiplyBy {
   static void doit(num n)
   {
      std::cout << 1.0*n.number << std::endl;
   }
};

template<typename num> struct MultiplyBy<num, float> {
   static void doit(num n)
   {
      std::cout << 1.5*n.number << std::endl;
   }
};

template<typename num> class A  {
public:
  num n;

  template<typename type>
  void multiplyBy()
  {
     MultiplyBy<num, type>::doit(n);
  }
};


int main() {
  A<One> aOne;
  A<Two> aTwo;
  aOne.multiplyBy<int>();   // 1
  aOne.multiplyBy<float>(); // 1.5
  aTwo.multiplyBy<int>();   // 2
  aTwo.multiplyBy<float>(); // 3

  return 0;
}
冷俊健
2023-03-14

您可以使用标记分派:

#include <iostream>

class One {
public:
  static const int number = 1;
};

class Two {
public:
  static const int number = 2;
};

template<typename num>
class A  {
    public:
    num n;

    private:
    template<typename> struct Tag {};

    void multiplyBy(Tag<int>) {
        std::cout << 1.0*n.number << std::endl;
    }

    void multiplyBy(Tag<float>) {
        std::cout << 1.5*n.number << std::endl;
    }

    public:
    template<typename type>
    void multiplyBy() {
        multiplyBy(Tag<type>());
    }
};


int main() {
  A<One> aOne;
  A<Two> aTwo;
  aOne.multiplyBy<int>();   // 1
  aOne.multiplyBy<float>(); // 1.5
  aTwo.multiplyBy<int>();   // 2
  aTwo.multiplyBy<float>(); // 3

  return 0;
}
 类似资料:
  • 这是我在玩变量模板时遇到的一个问题。我有一些代码,使用专业化来计算参数包中的“有趣”类型,就像这样: 这段代码工作正常,但是如果我想使用相同的方法来计算类模板,我会遇到问题: 上面的代码编译失败,错误是"预期的类型,得到了'向量'"开始的行"结构计数"。我也无法更简单的东西,所有的类模板接受一个参数: 这段代码也无法编译,再次在以“结构计数”开头的行中抱怨“预期的类型,得到了‘_First’”。有

  • 本文向大家介绍解读C++编程中类模板的三种特化,包括了解读C++编程中类模板的三种特化的使用技巧和注意事项,需要的朋友参考一下 1.类模板显式特化 为了进行特化,首先需要一个通用的版本,称主模板.主模板使用了标准库堆算法.  堆 是一种线性化的树形结构,将一个值压入一个堆中, 实际上等于将该值插入到一个树形结构中;将一个值从堆中取出就等于移除并返回堆中最大值.但在处理字符的指针时会碰钉子.堆将按照

  • 问题内容: 这是我的代码: 它运作良好。但是当我尝试添加这个 我遇到编译器错误:«int MyClass :: DoSomething()»的«>»令牌模板标识«DoSomething <0>»之前的无效显式专门化与任何模板声明都不匹配 我使用g ++ 4.6.1应该怎么做? 问题答案: 不幸的是,如果不对外部模板进行特殊化处理,就不能对作为类模板成员的模板进行特殊处理: C ++ 11 14.7

  • 我有一个问题,我想在下面的代码中专门化模板类的模板成员函数。这个问题的答案是模板类成员函数的显式特化,这似乎表明它无法完成。这是正确的吗,如果是这样,我可以使用任何解决方法,以便在编译时通过内联inc函数进行扩展? 非常感谢! g吐槽道: test2.cpp:32:13: 错误: 非命名空间作用域中的显式专用化 'struct IdxIterator' test2.cpp:32:25: 错误: 非

  • 但是两者似乎都不起作用,我不能不定义这些函数,因为我得到了函数的未定义引用错误。我假设这个错误是因为函数是模板。实现非空纯虚函数的适当方法是什么?