gpt4 book ai didi

c++ - 当作为函数模板的 T* 参数传递时,使用运算符 T* 强制模板类

转载 作者:行者123 更新时间:2023-11-28 01:13:50 26 4
gpt4 key购买 nike

假设我有一个这样的函数模板:

template<class T>
inline
void
doStuff(T* arr)
{
// stuff that needs to use sizeof(T)
}

然后在另一个.h filee 我有一个模板类 Foo有:

public: operator T*() const;

现在,我意识到那些是不同的 T。但是如果我有一个变量 Foo<Bar> f在堆栈上,将其强制为任何 类型的指针的唯一方法是调用 operator T*() .然而,如果调用doStuff(f) , GCC 提示 doStuff不能带Foo<Bar>而不是自动使用运算符 T*()强制Bar*然后用 Bar 专门化函数模板作为T .

我能做些什么来使这两个模板一起工作吗?还是模板函数的参数必须是真正的指针类型,或者带有强制运算符的模板类被传递给非模板函数?

最佳答案

海湾合作委员会是正确的。在模板参数中,只考虑完全匹配,不考虑类型转换。这是因为否则可能必须考虑无限(或至少呈指数)的转化量。

如果 Foo 是您要运行的唯一其他模板,最好的解决方案是添加:

template<typename T> inline void doStuff(const Foo<T>& arr) {
doStuff(static_cast<T*>(arr));
}

如果您在使用大量模板时遇到此问题,这个问题应该可以解决:

#include <boost/type_traits/is_convertible.hpp>
#include <boost/utility/enable_if.hpp>
template<template <typename> class T, typename U> inline typename boost::enable_if<typename boost::is_convertible<T<U>, U*>::type>::type doStuff(const T<U>& arr) {
doStuff(static_cast<U*>(arr));
}

虽然有点冗长;-)

关于c++ - 当作为函数模板的 T* 参数传递时,使用运算符 T* 强制模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/196088/

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