具有类型别名的替代类实现

时间:2018-10-08 15:36:30

标签: c++

我有一个包含多个类的项目,其中有些具有替代实现。

我正在寻找一种干净的方法,以-D标志在这些实现之间切换,而不必更改使用该类的每个文件。

例如,我可能有一个名为Foo_A的类。它在各种位置使用。但是我还有一个备用名称为Foo_B。它的设计假设有些许不同,在某些情况下可能会更好地工作。它具有相同的界面。

我正在考虑的一种方法是,当我们想使用Foo_AFoo_B时,我们调用Foo,无论哪种定义都将被使用。< / p>

This answer here建议使用模板化类型别名可能是一种方法。

我做了一些MWE尝试来测试这个概念:

main.cpp

// clang++ -std=c++14 -pedantic -Wall main.cpp -o main -v
#include "choose.h"
#include <iostream>

int main(int argc, char *argv[])
{
  Foo<int> foo;
  std::cout << foo.member() << "\n";
  return 0;
}
选择.h
#ifndef CHOOSE_H
#define CHOOSE_H

#ifdef A_SYSTEM
    #include "foo_a.h"
    template <typename T> using Foo = Foo_A<T>;
#else
    #include "foo_b.h"
    template <typename T> using Foo = Foo_B<T>;
#endif

#endif //CHOOSE_H
foo_a.h
#ifndef FOO_A_H
#define FOO_A_H

template<typename T>
class Foo_A
{
 public:
  Foo_A();
  int member()
  {
    return 4;
  };
};

#endif //FOO_A_H
foo_b.h
#ifndef FOO_B_H
#define FOO_B_H

template<typename T>
class Foo_B
{
 public:
  Foo_B();
  int member()
  {
    return 2;
  };
};

#endif //FOO_B_H

很不幸,我遇到了编译错误undefined reference to Foo_B<int>::Foo_B()'

我还没去过#### foo_a.h

#ifndef FOO_A_H
#define FOO_A_H

template<typename T>
class Foo_A
{
 public:
  Foo_A()
  {
    val = 4;
  };
  int member()
  {
    return 4;
  };
  int val;
};

#endif //FOO_A_H
foo_b.h
#ifndef FOO_B_H
#define FOO_B_H

template<typename T>
class Foo_B
{
 public:
  Foo_B()
  {
    val = 2;
  };
  int member()
  {
    return val;
  };
  int val;
};

#endif //FOO_B_Hble to solve this issue yet.  However, my first question is if this is a sensible design for what I'm trying to achieve?  If so, what am I doing wrong in the MWE? 

编辑 我尚未定义构造函数,从而解决了MWE问题。

foo_a.h
#ifndef FOO_A_H
#define FOO_A_H

template<typename T>
class Foo_A
{
 public:
  Foo_A()
  {
    val = 4;
  };
  int member()
  {
    return val;
  };
  int val;
};

#endif //FOO_A_H
foo_b.h
#ifndef FOO_B_H
#define FOO_B_H

template<typename T>
class Foo_B
{
 public:
  Foo_B()
  {
    val = 2;
  };
  int member()
  {
    return val;
  };
  int val;
};

#endif //FOO_B_H

0 个答案:

没有答案