【问题标题】:Module dependencies when using template function specializations使用模板函数特化时的模块依赖关系
【发布时间】: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++ 需要两个条件:

  1. 所有规范都需要在使用前声明
  2. 必须在每次特化之前声明主函数原型

我可以在 B.h 中包含 A.h。或者我可以在 B.h 中重复 template &lt;typename T&gt; 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&lt;X&gt; 的人已经将A.h 包括在SubtestB.h 用于X,所以我没有看到问题
  • B.h 必须包含A.h,否则以错误顺序包含它们的客户端(B.h,然后是A.h)会出现编译错误。

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


【解决方案1】:

虽然特化“需要在使用之前声明”是真的,但这并不意味着在调用者被定义之前,而是在它被实例化之前,所以至于使用有问题的专业化。这对任何定制方案都至关重要:您定义基本案例,然后是客户#include,并在定义之后立即为其类定义特化。如果他们有可用的课程,其他客户必然有可用的专业化,所以一切正常。自 C++98 以来,这些都没有改变。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多