如何隐藏实现助手模板?

Jes*_*per 18 c++ templates

假设我在头文件中声明了两个模板函数:

template <typename T> void func1(const T& value);
template <typename T> void func2(const T& value);
Run Code Online (Sandbox Code Playgroud)

并且假设这些函数的实现(也在头文件而不是源文件中,因为它们是模板)使用一些实现辅助函数,它也是一个模板:

template <typename T> void helper(const T& value) {
    // ...
}

template <typename T> void func1(const T& value) {
    // ...
    helper(value);
}

template <typename T> void func2(const T& value) {
    // ...
    helper(value);
}
Run Code Online (Sandbox Code Playgroud)

在我包含头文件的任何源文件中,辅助函数都是可见的.我不希望这样,因为辅助函数只是一个实现细节.有没有办法隐藏辅助功能?

Mik*_*our 20

一种常见的方法(例如,在许多Boost库中使用)是将助手放在一个名为的名称空间中details,可能在一个单独的标题中(包含在"public"标题中).

没有办法阻止它可见和可调用,但这清楚地表明它是实现的一部分,而不是接口.


Joh*_*ing 5

我脑子里有两个选择:

  1. 将所有实现移到 hpp 文件中,该文件包含在 h 文件的底部。
  2. 将您的代码重构为类模板,然后将帮助程序设为私有。

  • 我不明白第一个选项将如何解决任何问题。该 hpp 文件仍将包含在编译单元中,您在其中声明的任何内容仍将在包含它的源文件中可见。 (4认同)

ild*_*arn 5

既定的先例是将这种东西放在一个特别(即一致)命名的嵌套命名空间中。Boost 使用namespace details,Loki 使用namespace Private。显然没有什么可以阻止任何人使用这些名称空间的内容,但是这两个名称都传达了它们的内容不打算供一般消费的含义。

如此说来,一个简单的替代方法是打开func1func2从免费函数模板到一些共同类的静态成员函数模板; 这样,helper可以简单地成为所述类的私有成员,对外界不可见:

struct funcs {
    template<typename T>
    static void func1(T const& value) {
        // ...
        helper(value);
    }

    template<typename T>
    static void func2(T const& value) {
        // ...
        helper(value);
    }

private:
    template<typename T>
    static void helper(T const& value) {
        // ...
    }
};
Run Code Online (Sandbox Code Playgroud)