Я новичок в метафункциях. Я хочу написать функцию, которая заменяет все совпадения определенного типа в составном типе на какой-то другой тип. Например: 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
из базовой функции.
Теперь у меня нет идей. Как бы вы решили такую проблему?
replace<const void, void, const int>::type
? А как насчетreplace<void,int,double>
? - person David Rodríguez - dribeas   schedule 08.05.2012Write a ternary metafunction replace_type<c,x,y> that takes an arbitrary compound type c as its first parameter, and replaces all occurences of a type x within c with y.
- person nijansen   schedule 08.05.2012