使用模板功能专业化时的模块依赖性

时间:2020-05-12 19:13:32

标签: c++ dependencies template-specialization c++20

请查看以下代码段(伪代码,未编译):

A.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 ++需要两个条件:

  1. 使用所有规范之前必须先声明
  2. 必须在每次专门化之前声明主函数原型

我可以在B.h中加入A.h。或者我可以在B.h中重复template <typename T> void SubTest(T t) = delete;来满足条件2。但是,这仍然不能满足条件1。

我可以将B.h包含在A.h的中间,但这会造成(逻辑上)不必要的依赖关系。

有没有办法在C ++到C ++ 20的编译时解决此问题?

1 个答案:

答案 0 :(得分:3)

虽然确实是“必须在使用之前声明专业化”,但这并不意味着在对其调用者进行定义之前,而是在对其进行实例化之前,因此关于使用所涉及的专业化。这对于任何定制方案都是至关重要的:首先定义基本情况,然后定义客户端#include,并在定义后立即为其类定义特殊化。如果其他客户拥有可用的类,则他们必然具有可用的专业知识,因此一切正常。自 C ++ 98 以来,所有这些都没有改变。

(同时,您不能为函数重复=delete:该函数视为定义,并且也必须出现在第一个声明中。)