Скрытие шаблонной вспомогательной функции - статические члены или безымянное пространство имен - PullRequest
6 голосов
/ 17 ноября 2011

Я пытаюсь написать библиотеку, в которой у меня есть некоторые шаблонные функции, некоторые из которых являются вспомогательными функциями, поэтому я не хочу, чтобы мои пользователи имели к ним доступ.Некоторый базовый код может быть

//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 ]

8 голосов
/ 17 ноября 2011

Один из способов сделать это - иметь «подробное» или «внутреннее» пространство имен. Вот сколько библиотек это делает.

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);
    }
}
3 голосов
/ 17 ноября 2011

Делайте то, что делают многие библиотеки шаблонов (например, Eigen): используйте четко названное пространство имен для конкретной реализации (например, myfuncs::impl) и полагайтесь на социальную инкапсуляцию (т. Е. Пользователь не желает вызывать шаблоны изпространство имен реализации).

0 голосов
/ 23 апреля 2015

Вы можете:
В 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...