如何为想要公开相互递归函数的仅标头库组织包含
How to organize includes for a header-only library that wants to expose mutually recursive functions?
我正在创建一个库,以便有如下所示的函数:
template <typename T> bool A (int, int, T&);
template <typename T> bool B (int, int, T&);
template <typename T>
class IFoo {
virtual T funct(int i) = 0;
};
template <typename T>
class FooA : IFoo<T> {
virtual T funct(int i) override {
if (!i) {
return FooB(i-1);
} else {
return T(0);
}
}
};
template <typename T>
class FooB : IFoo<T> {
virtual T funct(int i) override {
if (!i) {
return FooA(i-1);
} else {
return T(1);
}
}
};
这些定义需要将代码拆分为声明和定义部分,以便允许两个过程相互了解,然后同时访问实现。
但我的问题是,我如何以清晰的方式公开这些函数(意思是,我应该如何编写一个标头来封装依赖包含模式(,同时还可以轻松添加新的"函数"或其他相互递归的组件(含义、函数或派生类(,以便组件的用户不必手动订购声明标头和定义标头的包含?
通过将声明与实现分开。
template <typename T>
class IFoo {
virtual T funct(int i) = 0;
};
template <typename T>
class FooA : IFoo<T> {
virtual T funct(int i) override; // declaration only...
};
template <typename T>
class FooB : IFoo<T> {
virtual T funct(int i) override {
if (!i) {
return FooA<T>(i-1);
} else {
return T(1);
}
}
};
// implementation here - once all type information is available
template<typename T>
T FooA<T>::funct(int i) {
if (!i) {
return FooB<T>(i-1);
} else {
return T(0);
}
}
如何组织标题?
这是一种方法:
detail/ifoo.hpp
#pragma once
template <typename T>
class IFoo {
virtual T funct(int i) = 0;
};
detail/fooa.hpp
#pragma once
#include "ifoo.hpp"
template <typename T>
class FooA : IFoo<T> {
virtual T funct(int i) override;
};
detail/foob.hpp
#pragma once
#include "ifoo.hpp"
template <typename T>
class FooB : IFoo<T> {
virtual T funct(int i) override;
};
细节/impl_fooa.hpp
#pragma once
#include "fooa.hpp"
#include "foob.hpp"
template<typename T>
T FooA<T>::funct(int i) {
if (!i) {
return FooB<T>(i-1);
} else {
return T(0);
}
}
细节/impl_foob.hpp
#pragma once
#include "fooa.hpp"
#include "foob.hpp"
template<typename T>
virtual T FooB<T>::funct(int i) override {
if (!i) {
return FooA<T>(i-1);
} else {
return T(1);
}
}
最后你的标题
图书馆.hpp
#pragma once
#include "detail/ifoo.hpp"
#include "detail/fooa.hpp"
#include "detail/foob.hpp"
#include "detail/impl_fooa.hpp"
#include "detail/impl_foob.hpp"
将强连接的组件放在一个标头中。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何在Elixir中调用递归函数并行
- 递归函数有效,但无法记忆
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么递归函数的最终输出是 5?
- 有没有办法使用递归函数找到数组中最小值的 INDEX?C++
- 如何将记忆应用于此递归函数?
- 如何从递归函数中完全返回,该函数给出了每个函数结果的累积相加?
- 无穷大而循环时具有递归函数
- 即使没有调用这个递归函数,它是如何工作的?
- 如何使此递归函数从给定的起始位置返回最小的整数?
- 此递归函数的每次迭代的值存储在哪里?
- 可以清除递归函数中的变量吗?
- 如何在递归函数调用中返回当前函数值
- 递归函数 c++ 的复杂性
- 这个递归函数有什么作用?运行时的复杂性是多少?
- 任何人都可以查明我的递归函数中的错误吗?
- 递归函数的返回类型推导
- 如何为想要公开相互递归函数的仅标头库组织包含
- 内联函数不能包含递归、go to循环等