質問

関数の戻り型を推測し、それをリッチタイプのメンバー関数として使用しようとしています。このため、DECLTYPE式を使用しています。しかし、指定された関数が引数として参照を受けている場合、私の試みはすべてコンパイルに失敗しました:

  • CLEMTYPE式で私のクラスのメンバー変数を使用することはできません。
  • 関数パラメータに一時的なものを使用することはできません。この関数はリファレンスを取りますので、一時的な非const LValue参照をバインドできません(下のfunc1

私はまた、さまざまなキャスティングオペレーターを試して、参照を一時的に行ってみましたが、有効な表現のようです。

ここでコード例:

template<typename data_type, typename functor_type>
class MyClass
{
public:
    auto func1() -> decltype(functor_type::process(this->m_data)) // <--
    {
        return functor_type::process(m_data);
    }

    auto func2() -> decltype(functor_type::process(data_type{})) // <--
    {
        return functor_type::process(m_data);
    }

private:
    data_type m_data;
};

struct Functor
{
    static int process(int& a) { return a; }
};

int main()
{
    MyClass<int, Functor> m;
    int b = m.func1();
    int c = m.func2();
}
.

役に立ちましたか?

解決

クラスは関数宣言で完全ではないため、クラスはメンバー関数本体にあるため、すでに宣言されているメンバーを使用できます。

2番目の場合、標準ライブラリはdeclvalを提供し、そのテンプレートパラメータタイプを返すように宣言された関数テンプレートです。特定の種類の式が必要な場合は、これを未評価のコンテキストで使用できます。

だから次のバージョンが機能するはずです。

#include <utility> // for declval

template<typename data_type, typename functor_type>
class MyClass
{
private:
    // Declare this before `func1`
    data_type m_data;

public:
    // Use the already declared member variable
    auto func1() -> decltype(functor_type::process(m_data))
    {
        return functor_type::process(m_data);
    }

    // Or use `declval` to get an expression with the required reference type
    auto func2() -> decltype(functor_type::process(std::declval<data_type&>()))
    {
        return functor_type::process(m_data);
    }
};    
.

他のヒント

std::declval<data_type&>()

を探していると思います

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top