使用模板函数特化时的模块依赖性

Module dependencies when using template function specializations

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

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;
}

如您所见,我想要一个 class 模板方法来调用函数模板。该功能以各种方式专门化。一些专业化位于 A.h 中,另一些位于可选的 headers 中(如 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.

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

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

虽然特化确实“需要在使用前声明”,但这并不意味着在调用者 定义 之前,而是在 实例化以便使用相关专业化。这对于任何定制方案都是至关重要的:您定义基本情况,然后是客户 #include 并在其定义之后立即为他们的 类 定义专业化。如果其他客户有 类 可用,则他们必须有可用的专业化,所以一切正常。 None 自 C++98.

以来已更改

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