我是元功能的新手。我想编写一个函数,将复合类型中某种类型的所有匹配项替换为其他类型。例如:replace<void *, void, int>::type
应该是int *
,replace<void, void, int>::type
应该是int
,等等。
到目前为止,我基本上以两种不同的方法失败了:
template
<
typename C, // Type to be searched
typename X, // "Needle" that is searched for
typename Y // Replacing type
>
struct replace
{
typedef C type;
};
// If the type matches the search exactly, replace
template
<
typename C,
typename Y
>
struct replace<C, C, Y>
{
typedef Y type;
};
// If the type is a pointer, strip it and call recursively
template
<
typename C,
typename X,
typename Y
>
struct replace<C *, X, Y>
{
typedef typename replace<C, X, Y>::type * type;
};
这对我来说似乎很简单,但我发现当我尝试时replace<void *, void *, int>
,编译器无法决定是否使用replace<C, C, Y>
或replace<C *, X, Y>
在这种情况下,所以编译失败。
我尝试的下一件事是已经在基本函数中剥离指针:
template
<
typename C,
typename X,
typename Y
>
struct replace
{
typedef typename boost::conditional
<
boost::is_pointer<C>::value,
typename replace
<
typename boost::remove_pointer<C>::type,
X, Y
>::type *,
C
>::type
type;
};
...这是当我发现我也不能这样做的时候,因为当时type
显然没有定义,所以我不能typedef
从基本函数递归。
现在我没有想法了。你会如何解决这样的问题?