gpt4 book ai didi

C++ 返回模板函数

转载 作者:行者123 更新时间:2023-11-30 01:54:55 25 4
gpt4 key购买 nike

我有这种类型的功能:

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>();

但是我得到一个错误:“错误:返回值类型与函数类型不匹配”因为每次返回都有不同的类型..

我有办法让它工作吗?因为从运行时的角度来看,我看不到任何错误,只有编译器有问题。

最佳答案

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

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

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

您有两种选择:一种适用于您的特定情况的骇人听闻的选择,以及一种通用的选择。

黑客正在使用 reinterpret_cast<T(*)()>在所有return声明。对于正确的 T brach,这将是一个空操作。其他分支永远不会在运行时执行,所以一切都会好起来的。

另一种解决方案是使用模板特化。因为它是 bad idea to specialise function templates ,您可以使用著名的“委托(delegate)给类”技巧:

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();
}

关于C++ 返回模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21303412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com