2011-11-17 10 views
6

Estoy tratando de escribir una biblioteca donde tengo algunas funciones de plantilla, algunas de las cuales son funciones auxiliares, así que no quiero que mis usuarios tengan acceso a ellas. Algunos códigos básicos pueden serOcultar la función de ayudante con plantilla: miembros estáticos o espacio de nombre sin nombre

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

¿Es posible ocultar de algún modo la función auxiliar para que los usuarios de la biblioteca no puedan llamarla directamente? Pensé que un espacio de nombres sin nombre podría hacer el trabajo, pero como estoy usando plantillas, no puedo dividir la declaración de la función y el cuerpo entre un encabezado y un archivo de implementación. Poner el espacio de nombre sin nombre en un archivo de encabezado no sirve de nada y tiene un estilo incorrecto. Lo único que puedo hacer es crear una clase mylib y encapsular las funciones como funciones estáticas privadas/públicas.

Cualquier solución mejor sería muy apreciada.

Phil

+1

que sugieren el cambio 'namespace' a 'class' y hacer todas las funciones' static', y luego poner su 'helper' en' private'. – neuront

Respuesta

8

Una forma de hacerlo es tener un "detalle" o espacio de nombres "interno". Eso es cuántas bibliotecas lo hacen.

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

hacer lo que muchos bibliotecas de plantillas (como Eigen) hacer: utilizar un espacio de nombres específico de la implementación claramente con un nombre (como myfuncs::impl) y se basan en la encapsulación sociales (es decir, el usuario no dispuesto para llamar a las plantillas de la aplicación espacio de nombres).

+1

Y documentación: garantizamos una interfaz estable, excepto por lo que está en 'impl', y si elige confiar en ella, no nos importa si su software se rompe en la actualización. –

0

Puede:
En header.h:

#ifndef AAA_H 
#define AAA_H 
namespace myfuncs 
{ 
    template<class T> 
    std::string dostuff(); 
} 
#include "aaa.cpp" 
#endif // AAA_H 

En 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 

En main.cpp:

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

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