我正在寻找以下问题的解决方案:我有一个类,我希望为所有类型的指针和所有类型的数组重载一个运算符(在本例中为&
)。在数组的实现中,我需要访问数组大小,并且在指针的实现内部,我必须能够使用解除引用的对象做一些事情。
正如here所指出的,数组的方式非常明确:
template<typename T, unsigned int N>
void operator&(T (&arr)[N])
{
cout << "general array operator: " << N << "\r\n";
}
但是对于指针,以下两种方法都不起作用:
// if I use this, the operator gets ambigous for arrays
template<typename T>
inline void operator&(T* p)
{
cout << "general pointer operator: " << (*p) << "\r\n";
}
// this doesn't work because one cannot dereference void*
void operator&(void* p)
{
cout << "general pointer operator\r\n";
(*this) & (*p);
}
是否有任何好的和干净的解决方案来实现操作符对任意数组和任意指针的不同行为?
这是一个完整的示例代码:
#include <iostream>
struct Class
{
template<typename T>
void operator&(T* p)
{
std::cout << "general pointer operator" << (*p) << std::endl;
}
template<typename T, unsigned int N>
void operator&(T (&arr)[N])
{
std::cout << "general array operator" << N << std::endl;
}
};
int main()
{
int myarr[5];
int* p = myarr;
Class obj;
obj & myarr; // error: operator is ambigous
obj & p; // works
return 0;
}
答案 0 :(得分:4)
我必须承认我不知道为什么你的代码片段无法正确编译。无论如何,一个好的旧标签调度解决方案似乎正在起作用。
class cClass
{
public:
template<class T, size_t N>
void impl(T (&x)[N], std::true_type)
{
cout << "general array operator" << N << '\n';
}
template<typename T>
void impl(T* p, std::false_type)
{
cout << "general pointer operator" << (*p) << '\n';
}
template<typename T>
void operator&(T && x)
{
impl( std::forward<T>(x), std::is_array< typename std::remove_reference<T>::type >() );
}
};
答案 1 :(得分:2)
更改最少代码的解决方案是:
template<typename T>
void operator&(T*const& p)
摆脱了歧义。我自己带着标签发送。
答案 2 :(得分:1)
C ++ 98解决方案是让指针获取操作符将 const引用带到指针。
#include <iostream>
struct Class
{
template<typename T>
void operator&(T* const &p)
{
std::cout << "general pointer operator " << (*p) << std::endl;
}
template<typename T, unsigned int N>
void operator&(T (&)[N])
{
std::cout << "general array operator " << N << std::endl;
}
};
int main()
{
int myarr[1] = { 2 };
int* p = myarr;
Class obj;
obj & myarr;
obj & p;
return 0;
}
输出:
general array operator 1
general pointer operator 2