我可以在类之外定义私有模板函数吗?

时间:2015-07-16 13:59:13

标签: c++ function templates private public

我在头文件中有两个模板函数generatePermspermute(不是类,只是带有实用程序类型函数的通用头文件)。我希望generatePerms可以公开访问,但permute不应该。有没有办法做到这一点?我不认为我可以在类之外使用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

2 个答案:

答案 0 :(得分:2)

您可以将函数作为静态函数放在Util类中,如

//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(...),你可以将它包装在一个全局函数中,虽然我不推荐它。)

答案 1 :(得分:0)

一种常见的技术是将函数放在名为impldetail的名称空间中:

namespace my_ns {
namespace detail {
  void permute() {}
}

void generatePerm() {
  using namespace detail;
  ...
  permute();
  ...
}
}

它没有对您的命名空间进行轮询(因此它不会在用户自动完成时显示),并且普遍接受这种命名空间内的任何内容都是库内部的,不应该被触及。 / p>

另一种选择是使它们成为静态函数:

class GlobalWhatever {
  private:
    static void permute() {}

  public:
    static void generatePerm() {}
};