【问题标题】:Elegant function definition in C++C++ 中优雅的函数定义
【发布时间】:2016-05-27 08:26:01
【问题描述】:

我有以下功能:

void func1(int8_t input);
void func1(int16_t input);
void func1(int32_t input);
void func1(float input);

这四个函数的实现是相同的,除了一些内部值与输入类型(int8_tint16_tint32_tfloat)一致。

目前我正在通过复制粘贴创建其他三个功能,但这很乏味。

有什么办法让我只写一个函数(例如func1(int8_t input);),而在构建时,其他三个函数会自动创建?

或者这可以在不需要其他三个功能的情况下工作?任何其他解决方案都非常受欢迎。

【问题讨论】:

  • 你不能有四个具有不同参数类型的相同函数名,而不是在 C 中。
  • 你不能在 C 中拥有这四个函数——它不支持重载,所以你必须给它们起不同的名字(例如 func1_int8)。它们在 C++ 中可以具有相同的名称,但该语言具有比 C 更好的机制(例如模板)来实现您想要的。
  • 请说明您的具体问题或添加其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。请参阅“如何提问”页面以获得澄清此问题的帮助。
  • 是什么阻止您为此使用模板? en.cppreference.com/w/cpp/language/function_template
  • 我打算建议一个模板,假设每个函数内部的逻辑基本相同。而且我不确定为什么这被标记了。这是一个完全合理的问题,答案是了解模板。

标签: c++ function macros


【解决方案1】:

使用模板函数是解决这个问题的方法:

template <typename T>
void func1(const T value)
{
   //   Do some stuff
}

如果你需要使用特殊的内部值,这取决于输入类型,你可以像这样使用辅助类型特征:

template <typename T>
struct SomeTrait
{
   static const int value = 10;
};

template <>
struct SomeTrait<float>
{
   static const int value = 20;
};

template <typename T>
void func1(const T value)
{
   std::cout << SomeTrait<T>::value << std::endl;
   //   Do some stuff
}

【讨论】:

    【解决方案2】:

    这显然需要一个模板函数。这将需要 C++11

    #include <type_traits>
    
    template <typename T
              // This constrains the template function instantiation to only
              // integral and floating types
              typename = typename std::enable_if<std::is_integral<T>::value
                                                 ||
                                                 std::is_floating_point<T>::value>::type>
    void func1(T input)
    {
      ......
      T tmp; // Use the same data type inside function
    }
    

    如果您想保持简单且不使用 C++11,那么就这样做

    template <typename T>
    void func1(T input)
    {
      ......
      T tmp; // Use the same data type inside function
    }
    

    缺点是您不能将此函数模板的实例化仅限于整数和浮点类型。不过,在这种情况下,您可以使用 boost::enable_if 和其他类型特征而不是 'std::enable_if' 和 std:: type_traits。

    【讨论】:

      【解决方案3】:

      您可以将其定义为模板函数:

      template<typename T> void func1(T input) {
          // ...
      }
      

      然后这样称呼它:

      float f = 1.234;
      func1<float>(f);
      
      int32_t i32 = 45678;
      func1<int32_t>(i32);
      

      【讨论】:

        【解决方案4】:

        如果函数的实现是相等的,你可以使用模板:

        template <typename T>
        void func1(const T value)
        {
           //   Do some stuff
        }
        

        如果某些输入类型的实现不同,您可以指定此专业化,例如

        void func1(const complex value)
        {
           //   Do some stuff related to complex values
        }
        

        【讨论】:

          【解决方案5】:

          最好的方法是使用模板函数。

          template <typename T>
          void your_function(const T input){
          
           // do something
          
          }
          

          另一方面,你可以指定你的模板函数

          template <>
          void your_function(const float input){
          
          
          // do some specific things
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-08-26
            • 2016-05-02
            • 2017-07-31
            • 2011-10-23
            • 2012-06-25
            • 1970-01-01
            • 2012-06-12
            • 2012-12-22
            相关资源
            最近更新 更多