隐藏模板化辅助函数 - 静态成员或未命名的命名空间

时间:2011-11-17 13:10:25

标签: c++ templates namespaces

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

//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类,并将这些函数封装为私有/公共静态函数。

非常感谢任何更好的解决方案。

菲尔

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:3)

执行许多模板库(如Eigen)所做的事情:使用明确命名的特定于实现的命名空间(例如myfuncs::impl)并依赖社交封装(即用户不愿意到来自实现命名空间的调用模板。)

答案 2 :(得分: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

在main.cpp中:

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

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