在C中选择过载的模板功能时的优先级

我有以下问题:

class Base
{
};

class Derived : public Base
{
};

class Different
{
};

class X
{
public:
  template <typename T>
  static const char *func(T *data)
  {
    // Do something generic...
    return "Generic";
  }

  static const char *func(Base *data)
  {
    // Do something specific...
    return "Specific";
  }
};

如果我现在做

Derived derived;
Different different;
std::cout << "Derived: " << X::func(&derived) << std::endl;
std::cout << "Different: " << X::func(&different) << std::endl;

我得到

Derived: Generic
Different: Generic

但是我想要的是对于派生自Base的所有类,调用特定的方法.
所以结果应该是:

Derived: Specific
Different: Generic

有什么办法可以重新设计X:func(…)来实现这个目标?

编辑:

假设X :: func(…)的调用者不知道如果作为参数提交的类派生自Base或不是.所以铸造到基地不是一个选择.
事实上,整个事情的想法是,X :: func(…)应该“检测”如果参数是从派生而来的,并调用不同的代码.
为了表现的原因,“检测”应在编译时进行.

我发现一个非常简单的解决方案!

class Base
{
};

class Derived : public Base
{
};

class Different
{
};

class X
{
private:
  template <typename T>
  static const char *intFunc(const void *, T *data)
  {
    // Do something generic...
    return "Generic";
  }

  template <typename T>
  static const char *intFunc(const Base *, T *data)
  {
    // Do something specific...
    return "Specific";
  }

public:
  template <typename T>
  static const char *func(T *data)
  {
    return intFunc(data, data);
  }
};

这个工作很棒,非常苗条!
诀窍是让编译器通过(否则无用的)第一个参数选择正确的方法.

翻译自:https://stackoverflow.com/questions/1332678/priority-when-choosing-overloaded-template-functions-in-c

转载注明原文:在C中选择过载的模板功能时的优先级