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

Posted

技术标签:

【中文标题】我可以在类之外定义私有模板函数吗?【英文标题】:Can I define a private template function outside of a class? 【发布时间】:2015-10-06 00:38:51 【问题描述】:

我有两个模板函数,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

【问题讨论】:

如果您不希望某个函数公开可用,请不要在 .h 文件中声明它并在 .cpp 文件中将其设为静态。 另外,我会简单地将您想要隐藏的功能放入一些namespace impl_Whatever 并告诉用户不要去那里。如果他不听,那就是他的问题。 @Baum mit Augen 如果您想要一个不错的代码库,这也是您的问题。 @marsh 我认为namespace myLib /*public stuff*/ namespace impl /*Hidden stuff*/ 没有问题。我不认为一些使用类的“hack”会使它变得更好。 @MichaelWalz 这并不容易,因为它是另一个模板函数调用的模板。 【参考方案1】:

你可以像这样将函数放在 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

并使用公共功能 Util::generatePerms(...)。 (如果你不想写 Util::generatePerms(...) 你可以把它包装在一个全局函数中,虽然我不推荐它。)

【讨论】:

我自己会使用class detailfriend generatePerms:不要坚持generatePermsclass 中的公共类型。即namespace Util class details ...;...generatePerms( ...) ...【参考方案2】:

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

namespace my_ns 
namespace detail 
  void permute() 


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


它不会污染您的命名空间(因此它不会在用户自动完成时显示),并且普遍认为此类命名空间内的任何内容都是库内部的,不应触及。

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

class GlobalWhatever 
  private:
    static void permute() 

  public:
    static void generatePerm() 
;

【讨论】:

以上是关于我可以在类之外定义私有模板函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在模板类之外定义构造函数[重复]

模板实现顺序表

我可以使用 MooseX::Declare 在类之外定义函数吗?

c ++:使用模板在类中定义可变长度数组

C++ Primer 5th笔记(chap 16 模板和泛型编程) 类模板的成员函数

如何在类中创建模板函数? (C ++)