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' 'वर्ग' तक और सभी कार्यों को 'स्थिर' बनाएं, और फिर अपने 'सहायक' को 'निजी' में रखें। – 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

क्या क्या कई टैम्पलेट लाइब्रेरियों (Eigen) की तरह कार्य करें: (जैसे myfuncs::impl के रूप में) एक स्पष्ट रूप से नामित कार्यान्वयन-विशिष्ट नाम स्थान का उपयोग करें और सामाजिक कैप्सूलीकरण पर भरोसा करते हैं (यानी उपयोगकर्ता नहीं तैयार कार्यान्वयन से टेम्पलेट्स कॉल करने के लिए नाम स्थान)।

+1

और प्रलेखन: हम 'स्थिर' में जो कुछ भी है, उसे छोड़कर एक स्थिर इंटरफ़ेस की गारंटी देते हैं, और यदि आपने उस पर भरोसा करना चुना है तो हमें परवाह नहीं है कि आपका सॉफ़्टवेयर अपग्रेड पर टूट गया है या नहीं। –

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; 
} 
संबंधित मुद्दे