关于c ++:隐藏模板化辅助函数 – 静态成员或未命名的命名空间

Hiding templated helper function - static members or unnamed namespace

我正在尝试编写一个库,其中有一些模板化的函数,其中一些是帮助函数,所以我不希望我的用户能够访问它们。一些基本代码可能是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//mylib.h

namespace myfuncs
{
    template<class T>
    void helper (T input, int extrainformation)
    {
       //do some usefull things
    }

    template<class T>
    void dostuff(T input)
    {
       int someinfo=4;
       helper(input, someinfo);
    }
}

是否可以隐藏helper函数,这样库的用户就不能直接调用它?我原以为一个未命名的名称空间可以完成这项工作,但因为我使用的是模板,所以无法在头文件和实现文件之间拆分函数声明和主体。将未命名的命名空间放在头文件中既没用又不好。我唯一能想到的就是创建一个mylib类,并将这些函数封装为私有/公共静态函数。

任何更好的解决方案都会受到赞赏。

菲尔


一种方法是使用"细节"或"内部"名称空间。有多少图书馆会这么做。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace myfuncs
{
    namespace detail
    {
        template<class T>
        void helper (T input, int extrainformation)
        {
           //do some usefull things
        }
    }

    template<class T>
    void dostuff(T input)
    {
       int someinfo=4;
       detail::helper(input, someinfo);
    }
}

做许多模板库(如eigen)所做的:使用一个明确命名的特定于实现的命名空间(如myfuncs::impl)并依赖于社会封装(即用户不愿意从实现命名空间调用模板)。


你可以:标题:h:

1
2
3
4
5
6
7
8
9
#ifndef AAA_H
#define AAA_H
namespace myfuncs
{
    template<class T>
    std::string dostuff();
}
#include"aaa.cpp"
#endif // AAA_H

在SoopCE.CPP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define AAA_CPP
#include <string>
namespace {
  template<class T>
  std::string helper ()
  {
     return"asdf";
  }
}

namespace myfuncs
{
    template<class T>
    std::string dostuff()
    {
        return helper<T>();
    }
}
#endif // AAA_CPP

在CPP中:

1
2
3
4
5
6
7
8
#include <iostream>
#include"aaa.h"

int main(int argc, char *argv[])
{
  std::cout << myfuncs::dostuff<std::string>();
  return 0;
}