1

Tのタイプまたはバリアントのいずれかを返したいテンプレート関数があります。私は次のようにしようとしましたが、コンパイラは'variant'をintに変換できないと文句を言います(この関数をT = intで使用します)。

バリアントを返すか、バリアントに含まれるタイプを返すことができるように、これをどのように実装する必要がありますか。

これは、ベクトル構造体から取得されます。

template <typename T>
T find_attribute(const std::string& attribute, bool isVariant = false)
{
    std::vector<boost::shared_ptr<node> >::iterator nodes_iter = _request->begin();

    for (; nodes_iter != _request->end(); nodes_iter++)
    {
        size_t sz = (*nodes_iter)->attributes.size();
        std::vector<node::attrib>::iterator att_iter = (*nodes_iter)->attributes.begin();
        for (; att_iter != (*nodes_iter)->attributes.end(); att_iter++)
        {
            if (att_iter->key.compare(attribute) == 0)
            {
                if (isVariant)
                {
                    return att_iter->value; //return variant
                }
                else
                {
                    return boost::get<T>(att_iter->value); // return type inside variant as given by T.
                }
            }
        }
    }
}
4

2 に答える 2

2

find_attribute<boost::variant>(const std::string& attribute)バリアントと通常のバージョンを返すテンプレートの特殊化を作成できますattribute<T>(const std::string& attribute)

通常のバージョンでは次のようになります。

return boost::get<T>(find_attribute<variant>(attribute));

ただし、テンプレートはコンパイル時に評価されることに注意してください。

find_attributeメンバー関数の場合、これはmsvcコンパイラでのみ使用できます。

テンプレートの特殊化ができない場合は、関数に別の名前を付けることができます。

于 2011-03-02T14:26:28.480 に答える
0

バリアントを返すか、バリアントに含まれる型を返すことができるように、これをどのように実装する必要がありますか。

できません。テンプレート パラメーターはコンパイル時に固定されるため、プログラムが何を返さなければならないかがわかった時点で、それはずっと前から決まっていません。

于 2011-03-02T14:20:59.287 に答える