我有一个包含多个类的项目,其中有些具有替代实现。
我正在寻找一种干净的方法,以-D
标志在这些实现之间切换,而不必更改使用该类的每个文件。
例如,我可能有一个名为Foo_A
的类。它在各种位置使用。但是我还有一个备用名称为Foo_B
。它的设计假设有些许不同,在某些情况下可能会更好地工作。它具有相同的界面。
我正在考虑的一种方法是,当我们想使用Foo_A
或Foo_B
时,我们调用Foo
,无论哪种定义都将被使用。< / p>
This answer here建议使用模板化类型别名可能是一种方法。
我做了一些MWE尝试来测试这个概念:
// 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