我也想拥有这样的东西
class A
{
public:
Array& operator()()
{ . . . }
};
class B
{
public:
Element& operator[](int i)
{ ... }
};
template<class T>
class execute
{
public:
output_type = operator()(T& t)
{
if(T == A)
Array out = T()();
else
{
Array res;
for(int i=0 ; i < length; ++i)
a[i] = t[i];
}
}
};
这里有两个问题。
只需将模板类特殊化。
template<class T>
class execute
{};
template<>
class execute<A>
{
A operator()(A& t)
{
/* use A, return A */
}
};
template<>
class execute<B>
{
B operator()(B& t)
{
/* use B, return B */
}
};
只需重载操作符。
// used for As
Array operator()(A& a)
{
// ...
}
// used for everything else
typename T::Element operator()(T& t)
{
// ...
}
如果你只需要 A
和 B
第二种情况也可能是针对 B
:
// used for Bs
B::Element operator()(B& b)
{
// ...
}