隐藏模板助手函数 - 静态成员或匿名命名空间

6

我正在尝试编写一个库,其中包含一些模板函数,其中一些是辅助函数,所以我不希望我的用户可以访问它们。一些基本代码可能如下:

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

有没有办法隐藏帮助程序,使库的用户无法直接调用它?我曾认为未命名命名空间可以完成这项工作,但由于我正在使用模板,因此无法在头文件和实现文件之间拆分函数声明和主体。将未命名命名空间放在头文件中没有用处且风格不佳。我能想到的唯一方法是创建一个mylib类并将函数封装为私有/公共静态函数。非常感谢任何更好的解决方案。

1
我建议将namespace改为class,并使所有函数都是static的,然后将您的helper放在private中。 - neuront
3个回答

8

一种方法是使用“详细”或“内部”命名空间。这是许多库的做法。

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

4

像Eigen等许多模板库一样,使用明确命名的实现特定命名空间(例如myfuncs::impl),并依赖于社交封装(即用户不愿意从实现命名空间中调用模板)。


1
文档:我们保证一个稳定的接口,除了 impl 中的内容。如果您选择依赖它,我们不会在升级时关心您的软件是否会出现故障。 - Matthieu M.

0
你可以:
在 header.h 文件中:
#ifndef AAA_H
#define AAA_H
namespace myfuncs
{
    template<class T>
    std::string dostuff();
}
#include "aaa.cpp"
#endif // AAA_H

在source.cpp文件中:
#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

In main.cpp:

#include <iostream>
#include "aaa.h"

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接