2011-11-17 10 views
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'にすべての関数を静的にし、' helper'を 'private'に入れます。 – neuront

答えて

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

(固有のような)多くのテンプレートライブラリは何ですか:実装からテンプレートを呼び出すことがすなわちユーザー望んでいない((などmyfuncs::implなど)明確に名付け実装固有の名前空間を使用し、社会的なカプセル化に依存しています名前空間)。

+1

とドキュメント: 'impl'にあるものを除いて、安定したインターフェースを保証しています。あなたがそれに頼ることを選択した場合、あなたのソフトウェアがアップグレードで壊れても気にしません。 –

0

あなたのことができますがheader.hで
:source.cppで

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

:main.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 

を:

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

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