【问题标题】:How to wrap user functions?如何包装用户函数?
【发布时间】:2020-06-18 16:49:03
【问题描述】:

我有三个函数将在项目的不同类中使用。这些函数使用(仅读取)公共变量,但以不同的方式操作输入数据。

我不确定如何包装这些函数。我实际上不希望用户可以使用常见的只读变量。我想出了两个解决方案:

  1. 仅 C 样式标头方法。此解决方案允许用户查看 var0 和 var1。这是我不想要的。 (命名空间方法也不能隐藏只读变量 AFAIK。)
#ifndef FUNC_H
#define FUNC_H
const int var0 = 30;
const int var1 = 75;

void func0(float input0)
{//manipulate input0//}

void func1(float input1)
{//manipulate input1//}

void func2(float input2)
{//manipulate input//}
#endif //FUNC_H
  1. 类方法
#ifndef FUNC_H
#define FUNC_H

class Func
{
    public:
        static void func0(float input0);
        static void func1(float input1);
        static void func2(float input2);

    private:
        Func();
        static const int var0 = 30;
        static const int var1 = 75;
};

void Func::func0(float input0){}
void Func::func1(float input1){}
void Func::func2(float input2){}

#endif //FUNC_H

这可行,但我不确定这是否是实现我想要的正确方法。基本上,我想将它们包装成类似于 STL 库。你有什么推荐的?

【问题讨论】:

    标签: c++ c++11 shared-libraries c++17 static-libraries


    【解决方案1】:

    如果您希望将函数放在头文件中(例如,作为内联函数或模板函数),通常使用detail 命名空间。是的,您的标头的用户可以访问它,但通常的做法是忽略它(因为它是一个实现细节)

    所以,

    #ifndef FUNC_H
    #define FUNC_H
    
    namespace detail {
        const int var0 = 30;
        const int var1 = 75;
    }
    
    void func0(float input0)
    {
        // Use `detail::var0`
    }
    
    void func1(float input1)
    {
        using namespace detail;
        // Or put a using declaration and
        // just use `var0`
    
    }
    
    void func2(float input2)
    {
        // ...
    }
    #endif //FUNC_H
    

    【讨论】:

      【解决方案2】:

      由于公共变量是实现的一部分,而不是接口,只需将它们与函数定义一起放在实现文件中即可。

      所以,布局可能是:

      // func_h.hpp
      #ifndef FUNC_H
      #define FUNC_H
      
      // only declarations
      void func0(float input0);
      void func1(float input1);
      void func2(float input2);
      
      #endif //FUNC_H
      

      // func_h.cpp
      
      // common variables not part of the interface
      const int var0 = 30;
      const int var1 = 75;
      
      // but definitions can use the common variables
      
      void func0(float input0)
      {//manipulate input0//}
      
      void func1(float input1)
      {//manipulate input1//}
      
      void func2(float input2)
      {//manipulate input//}
      

      【讨论】:

      • 作为一个更普遍的问题,这是向用户隐藏算法特定变量的通用方法,将它们放入.cppfiles 中吗?
      • 这至少是一种方式。这也是隐藏实现特定功能的方式。从 c++20 开始会有模块,这将使这个更干净。
      猜你喜欢
      • 2013-06-22
      • 1970-01-01
      • 2020-08-31
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 2011-06-21
      相关资源
      最近更新 更多