C 返回模板功能

c++ return template function

本文关键字:功能 返回      更新时间:2023-10-16

我具有这种类型的功能:

type uniRndtype()
{
    return typeValue;
}

现在我试图将它们包装在其他模板功能中:

template<typename T>
T(* uniRndType(void))()
{
    if (is_same<T, bool>::value)
    {
        return uniRndBool;
    } else if (is_same<T, char>::value)
    {
        return uniRndChar;
    } else
    ...
}

并这样称呼:

uniRndType<int>();

但是我遇到了一个错误:"错误:返回值类型不匹配函数类型" 因为每个退货都有不同的类型。

我有一种方法可以使它起作用吗?因为从运行时的角度来看,我没有发现错误,所以只有编译器有问题。

问题是,虽然优化者可以消除死去代码分支,但前端(词汇,句法&amp;语义分析)却不能。这意味着模板实例化中的所有代码都必须有效。也就是说,即使在此中:

if (is_same<T, bool>::value)
{
    return uniRndBool;
}

Tchar时,将永远不会执行身体,它仍然必须是有效的C 代码。当然不是,因为uniRndBool没有正确的类型。

您有两个选择:在您的特定情况下有效的hackish选择,而一种。

hackish One在所有return语句中都使用reinterpret_cast<T(*)()>。对于正确的T Brach,它将是一个无关。其他分支将永远不会在运行时执行,因此一切都可以。

另一个解决方案是使用模板专业化。由于专业化功能模板是一个坏主意,因此您可以使用众所周知的"代表到class"的技巧:

template <class T>
struct uniRndTypeHelper;
template <>
struct uniRndTypeHelper<bool>
{
  static bool (*get())() { return uniRndBool; }
};
template <>
struct uniRndTypeHelper<char>
{
  static char (*get())() { return uniRndChar; }
};
template<typename T>
T(* uniRndType(void))()
{
  return uniRndTypeHelper<T>::get();
}
template <typename T> T (*uniRndType())()
{
    //else
    ...
}
template <> bool (*uniRndType())()
{
    return uniRndBool;
}
template <> char (*uniRndType())()
{
    return uniRndChar;
}

仅此而已。

编辑:原则上,我们必须喜欢@angew。但这很麻烦

这是不起作用的,因为当编译器扩展给定类型的模板方法时,方法必须有效。您的类型t需要与列出的所有返回类型兼容,例如boolchar等。如我在评论中提到的,如果您通过std::string中的通过,您不会指望该方法起作用,您会吗?<<<<<<<</p>

解决此问题的一种方法是使用模板专业化来指示您想要的每种类型。

编译器需要知道编译时功能/方法将使用哪些类型。此时,您必须将此模板函数实例

但是,如果您使用模板方法使用模板类,则有两种方法:

1)只需在.h文件(在您声明模板类主体的位置)而不是原型中写入每个模板方法的实现;

2)或在.h文件中声明原型后,您需要使用可能会收到的模板参数进行构造。