c++模板接口的使用

C++ templates interfaces using

本文关键字:接口 c++      更新时间:2023-10-16

我发现模板接口非常优雅,尝试实现它面临着我无法解决的问题。我希望你能给我一些启示。

我有一个类,例如forge.h:

template<typename T> class Smelter;
template <typename T>
class Forge
{
    long SmeltIt(vector<T>& ore)
    {
        long res;
        Smelter<T> smelter;  
        for (const auto t : ore)
        {
            res += smelter.smelt(t);
        }
        return res;
    }
};

模板类Smelter没有实现,模板类Forge有实现。

现在,当我想添加类Iron时,我需要创建Iron .h并实现Smelter来使用它,这样 Iron .h:

#include "forge.h"
class Iron {};
template<>
class Smelter<Iron>
{
    long smelt(const Iron& iron) { return 5; }
};
int main()
{
    vector<Iron> ore;
    Iron iron;
    ore.push_back(iron);
    ore.push_back(iron);
    ore.push_back(iron);
    Forge<Iron> forge;
    cout << forge.SmeltIt(ore); //have to be 15
}

如果所有这些东西都在一个头文件中,一切都完美工作。但是,如果我创建iron.h,我试图实现冶炼厂,编译器找不到模板类冶炼厂。如果我在forge.h和iron.h中都创建了冶炼厂声明的副本,那么它们就会相互冲突。

最好的解决方案是什么?这将是非常有用的,如果我将能够实现我的模板接口在其他文件。如果没有这个,这样的模板接口就会变得丑陋,例如,如果forge.h是工具,在项目之间使用,而iron.h是我当前的专门化。

结果:

一切正常,问题不在描述的问题范围内,在名称空间内。所有的模板,即使可以在不同的文件之间分离它们(这是一个问题)-完美的工作。但是它们必须共享相同的命名空间

修复了一些小问题后,您的代码可以很好地编译(使用clang 3.3)并产生所需的结果。下面是固定的代码(在一个文件中,但是按照#include的顺序)

template<typename T> class Smelter;
template <typename T>
class Forge
{
public:
  long SmeltIt(std::vector<T>& ore)   // must be public; use std::
  {
    long res{};                       // must be initialized (to 0)
    Smelter<T> smelter;  
    for (const auto t : ore)
      res += smelter.smelt(t);
    return res;
  }
};
class Iron {};
template<>
class Smelter<Iron>
{
public:
  long smelt(const Iron& iron)       // must be public
  { return 5; }
};
int main()
{
  std::vector<Iron> ore;             // std::
  Iron iron;
  ore.push_back(iron);
  ore.push_back(iron);
  ore.push_back(iron);
  Forge<Iron> forge;
  std::cout << forge.SmeltIt(ore)    // have to be 15
        << std::endl;
}