哪个更好:显式或无类型get()?

时间:2016-04-11 18:37:59

标签: performance c++11 extensibility

假设同一个类A的以下两个版本:

版本1

class A
{
   public:
      enum class Retrievable { Integer, String };

      A(): m_integer(123), m_string("string") {}
      ~A() {}

      void* get(const Retrievable r)
      {
         switch (r)
         {
            case Retrievable::Integer:
               return static_cast<void*>(&m_integer);
            case Retrievable::String:
               return static_cast<void*>(&m_string);
            default:
               throw;
         }
      }

   private:
      int m_integer;
      std::string m_string;
};

第2版

class A
{
   public:
      A(): m_integer(123), m_string("string") {}
      ~A() {}

      int getInteger()        { return m_integer; }
      std::string getString() { return m_string;  }

   private:
      int m_integer;
      std::string m_string;
};

在清晰度,效率和可扩展性方面,这两种范例中的哪一种 - 单个无类型get()函数或单独的显式get()函数 - 更好?

2 个答案:

答案 0 :(得分:3)

选项1将内容转换为void*并进行运行时调度,这样做更慢,更安全,更难使用。

除非与脚本引擎进行交互,否则我无法想象使用选项1的理由。即使这样,也有很多更好的方法来处理它。一个受访者提出选项1甚至是选项2的另一种选择,这将是一个强大的不聘用,这将使我重新考虑到目前为止受访者的漏斗。

简而言之,选项2更好。

答案 1 :(得分:1)

版本A无论如何都不会编译,因为无论C如何,您都会尝试返回不是C的类型(Cstring的指针等)。< / p>

版本B可能更好,但也放弃了弯曲。除非你正在构建一些像JSON节点那样的多态类型,否则该函数应该描述行为,而不是返回类型。

再说一次,除非你正在编写一些JSON类,否则我没有太多意义来创建一个描述返回类型而不是行为的函数。 Person没有getHandgetLeg个函数,他有wavewalk等函数。

服务表现?我怀疑一个吸气剂会破坏你的应用程序的性能。