【发布时间】:2020-05-12 19:13:32
【问题描述】:
请查看以下代码sn-p(伪代码,未编译):
啊.h
template <typename T>
void SubTest(T t) = delete;
template <>
void SubTest(int i)
{
cout << i;
}
template <typename T>
class MyClass
{
public:
void Test(T t)
{
SubTest(t);
}
}
B.h
class X{};
template <>
void SubTest(X x)
{
cout << x;
}
如您所见,我想要一个类模板方法来调用函数模板。该功能以各种方式专门化。一些特化位于 A.h 中,另一些位于可选标头中(如 B.h)。 我想避免 A.h 依赖于 B.h 等,因为 A.h 可以独立工作,但应该可以通过许多其他提供专业化的模块进行扩展。从逻辑上讲,这种依赖是不必要的,但从技术上讲,它似乎无法避免。
AFAIK C++ 需要两个条件:
- 所有规范都需要在使用前声明
- 必须在每次特化之前声明主函数原型
我可以在 B.h 中包含 A.h。或者我可以在 B.h 中重复 template <typename T> void SubTest(T t) = delete; 来满足条件 2。但这仍然不能满足 1。
我可以将 B.h 包含在 A.h 的中间,但这会产生(逻辑上)不需要的依赖关系。
有没有办法在 C++ 到 C++20 的编译时解决这个问题?
【问题讨论】:
-
为什么你认为
A.h依赖于B.h? -
如果啊。包括 B.h.没有 B.h,我不能使用 A.h。或者你还有什么意思?
-
为什么
A.h会包含B.h?你写的我理解好像A.h取决于B.h。想要使用专业化Subtest<X>的人已经将A.h包括在Subtest和B.h用于X,所以我没有看到问题 -
B.h必须包含A.h,否则以错误顺序包含它们的客户端(B.h,然后是A.h)会出现编译错误。
标签: c++ dependencies template-specialization c++20