C 返回模板功能
c++ return template function
我具有这种类型的功能:
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;
}
当T
为char
时,将永远不会执行身体,它仍然必须是有效的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需要与列出的所有返回类型兼容,例如bool
,char
等。如我在评论中提到的,如果您通过std::string
中的通过,您不会指望该方法起作用,您会吗?<<<<<<<</p>
解决此问题的一种方法是使用模板专业化来指示您想要的每种类型。
编译器需要知道编译时功能/方法将使用哪些类型。此时,您必须将此模板函数实例
但是,如果您使用模板方法使用模板类,则有两种方法:
1)只需在.h文件(在您声明模板类主体的位置)而不是原型中写入每个模板方法的实现;
2)或在.h文件中声明原型后,您需要使用可能会收到的模板参数进行构造。
- 时钟功能返回零时差
- C++自动功能返回?
- 类型推论模板功能返回类型
- 从功能返回本地卡斯施说指针
- OPENCL-如何使辅助功能返回阵列并将内存的部分从恒定内存空间转移到私有
- C++ OPEN SSL 库 HMAC 功能返回值每次运行时都不相同
- 如果未存储由功能返回的指针,会发生什么
- 该功能返回空字符串
- C 制造功能返回数组交叉文件
- 当功能返回CSTRING时会发生什么
- 从功能返回将上下文更改为null
- 在模板中获取功能返回类型
- 从最大功能返回Stepanov注释
- 从功能返回时,向量的深拷贝行为
- 当功能返回时,Linux C 系统()调用崩溃
- STL模板功能返回一对
- 从C 中的功能返回时分割故障
- 提升侵入性unordered_set静态成员功能返回错误的尺寸类型
- 在功能返回之前,可以解锁Mutex会增加并发
- getProcAddress()为我的Hello World功能返回null