Hiding templated helper function - static members or unnamed namespace
我正在尝试编写一个库,其中有一些模板化的函数,其中一些是帮助函数,所以我不希望我的用户能够访问它们。一些基本代码可能是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //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); } } |
是否可以隐藏helper函数,这样库的用户就不能直接调用它?我原以为一个未命名的名称空间可以完成这项工作,但因为我使用的是模板,所以无法在头文件和实现文件之间拆分函数声明和主体。将未命名的命名空间放在头文件中既没用又不好。我唯一能想到的就是创建一个
任何更好的解决方案都会受到赞赏。
菲尔
一种方法是使用"细节"或"内部"名称空间。有多少图书馆会这么做。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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); } } |
做许多模板库(如eigen)所做的:使用一个明确命名的特定于实现的命名空间(如
你可以:标题:h:
1 2 3 4 5 6 7 8 9 | #ifndef AAA_H #define AAA_H namespace myfuncs { template<class T> std::string dostuff(); } #include"aaa.cpp" #endif // AAA_H |
在SoopCE.CPP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #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 |
在CPP中:
1 2 3 4 5 6 7 8 | #include <iostream> #include"aaa.h" int main(int argc, char *argv[]) { std::cout << myfuncs::dostuff<std::string>(); return 0; } |