我可以在 class 之外定义私有模板函数吗?
Can I define a private template function outside of a class?
我在头文件中有两个模板函数,generatePerms
和 permute
(不适用于 class,只是一个带有实用程序类型函数的通用头文件)。我希望 generatePerms
可以公开访问,但 permute
不应该。有什么办法吗?我不认为我可以在 class 之外使用 public:
和 private
,但也许有一种方法可以构造可以实现此目的的头文件?
示例头文件:
//header.hpp
#ifndef H_UTILITY
#define H_UTILITY
#include <vector>
//this one should be private
template <typename T>
void permute( std::vector<T> values, int n, std::vector<T> *perms ){ /* do stuff */ }
//this one should be public
template <typename T>
std::vector<T> generatePerms( std::vector<T> values, int n ){ /* do stuff, calls permute() */ }
#endif
一种常见的技术是将函数放在名称空间中,名称类似于 impl
或 detail
:
namespace my_ns {
namespace detail {
void permute() {}
}
void generatePerm() {
using namespace detail;
...
permute();
...
}
}
它不会污染您的命名空间(因此它不会在用户自动完成时显示),并且普遍认为这种命名空间内的任何内容都是库内部的,不应被触及。
另一种选择是使它们成为静态函数:
class GlobalWhatever {
private:
static void permute() {}
public:
static void generatePerm() {}
};
您可以将函数作为静态函数放在 Util class 中,如下所示
//header.hpp
#ifndef _H_UTIL_
#define _H_UTIL_
#include <vector>
class Util
{
private:
template <typename T>
static void permute( std::vector<T> values, int n, std::vector<T> *perms ){ /* do stuff */ }
public:
template <typename T>
static std::vector<T> generatePerms( std::vector<T> values, int n ){ /* do stuff, calls permute() */ }
};
#endif
并使用 public 函数
Util::generatePerms(...)
。
(如果你不想写 Util::generatePerms(...) 你可以将它包装在一个全局函数中,但我不推荐它。)
我在头文件中有两个模板函数,generatePerms
和 permute
(不适用于 class,只是一个带有实用程序类型函数的通用头文件)。我希望 generatePerms
可以公开访问,但 permute
不应该。有什么办法吗?我不认为我可以在 class 之外使用 public:
和 private
,但也许有一种方法可以构造可以实现此目的的头文件?
示例头文件:
//header.hpp
#ifndef H_UTILITY
#define H_UTILITY
#include <vector>
//this one should be private
template <typename T>
void permute( std::vector<T> values, int n, std::vector<T> *perms ){ /* do stuff */ }
//this one should be public
template <typename T>
std::vector<T> generatePerms( std::vector<T> values, int n ){ /* do stuff, calls permute() */ }
#endif
一种常见的技术是将函数放在名称空间中,名称类似于 impl
或 detail
:
namespace my_ns {
namespace detail {
void permute() {}
}
void generatePerm() {
using namespace detail;
...
permute();
...
}
}
它不会污染您的命名空间(因此它不会在用户自动完成时显示),并且普遍认为这种命名空间内的任何内容都是库内部的,不应被触及。
另一种选择是使它们成为静态函数:
class GlobalWhatever {
private:
static void permute() {}
public:
static void generatePerm() {}
};
您可以将函数作为静态函数放在 Util class 中,如下所示
//header.hpp
#ifndef _H_UTIL_
#define _H_UTIL_
#include <vector>
class Util
{
private:
template <typename T>
static void permute( std::vector<T> values, int n, std::vector<T> *perms ){ /* do stuff */ }
public:
template <typename T>
static std::vector<T> generatePerms( std::vector<T> values, int n ){ /* do stuff, calls permute() */ }
};
#endif
并使用 public 函数
Util::generatePerms(...)
。
(如果你不想写 Util::generatePerms(...) 你可以将它包装在一个全局函数中,但我不推荐它。)