1

コンポーネントのマップがあります。コンポーネントは、いくつかのデータを持つ POD タイプです。各コンポーネントには一意の識別子があります。マップは、特定のタイプのコンポーネントを一度に 1 つだけ所有できます。そのため、マップの所有コンポーネントを照会できるようにしたいと考えています。これは私がこれを達成するために使用しているコードです:

template <typename T>
bool has()
{
    auto found = map.find(T::tag);
    if (found != map.end()) return true;
    else return false;
}

これにより、次のような厄介なコードが生成されます。something.has<Component<int>>() && something.has<Component<float>>() ... etc;

コードの乱雑さを軽減するために、可変個引数テンプレートを利用したいと考えています。

template <typename T, typename... Args>
bool hasz()
{
    has<T>();
    has<Args>()...; /* expected ‘;’ before ‘...’ token */
}

has<Args>()...(疑似) に展開すべきではありませんhas<Args[0]>(), has<Args[1]>(), etc...(これは正当な構文になります)? そして、これを行うことはまったく可能ですか?

4

2 に答える 2

7

はい、関数を再帰的に呼び出すだけです。

template <typename T>
bool has()
{
    return map.end() != map.find(T::tag);
}

template <typename T, typename... Args>
bool has()
{
    return has<T>() && has<Args...>();
}

使い方?

この関数には 2 つのバージョンがあります。1 つのパラメーターを持つバージョンと n パラメーターを持つバージョンです。前者は基本ケースとして使用され、後者は再帰ケースとして使用されます。
したがって、これを行う場合:

has<bool,int,char,float>();

トレースは次のとおりです。

call to has<bool,int,char,float>()(再帰ケースの呼び出し)
call to has<bool,int,char>()(再帰ケースの呼び出し)
call to has<bool,int>()(再帰ケースの呼び出し)
call to has<bool>()(ベースケースの呼び出し)

注:もちろん、この例で使用した型には::tagメンバーがないため、この例は実際には機能しません。コール トレースのほんの一例です。さらに、例が過度に複雑にならないように、トレースを単純化しました。真のトレースは次のようになります。

call to has<bool,int,char,float>()(Call to recursive case)
....call to has<bool>()(Call to base case) //&& の左側
....call to has<int,char,float>()(Call to recursive case) //&& の右側
.... ....call to has<int>()(Call to base case) // && の左側
........call to has<char,float>()(Call to recursive case) // && の右側
........ ....call to has<char>()(Call to base case) // && の左側
.........................call to has<float>()(Call to base case) // && の右側

于 2013-10-02T11:51:35.137 に答える
2

使用できますstd::min

#include<algorithm>

template <typename... Args>
bool hasz()
{
    return std::min({has<Args>()...});
}

これにはショートサーキット動作がないことに注意してください -has<Args>すべての引数に対して常に評価されます。問題がある場合は、再帰バージョンを使用してください。

于 2013-10-02T11:55:03.567 に答える