私はメタ関数に不慣れです。複合型の特定の型のすべての一致を他の型に置き換える関数を作成したいと思います。例:replace<void *, void, int>::type
である必要がありint *
、でreplace<void, void, int>::type
ある必要がありますint
。
これまでのところ、基本的に2つの異なるアプローチで失敗しました。
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
、基本関数から再帰的に行うことはできません。
今、私はアイデアがありません。そのような問題をどのように解決しますか?