5

次のように定義された明示的な(つまり、推定されていない)テンプレートパラメータを持つ関数オブジェクトがあります。

struct foo
{
    template<class T>
    T operator()() const
    {
        return 5;
    }
};

foo bar = {};

私がそれをこのように呼ぼうとすると:

int main()
{
    int i = bar<int>();
    return 0;
}

コンパイルエラーが発生します。通常の関数のようにテンプレートパラメータを使用して関数オブジェクトを呼び出す方法はありませんか?私は本当にそれを関数オブジェクトとして持つ必要があります。無料の関数を作成することは、私にとって実際にはオプションではありません(または、少なくとも、それは非常に厄介なオプションです)。

4

3 に答える 3

9

残念ながら、そのように呼ぶことはできません。operator()次の構文を使用する必要があります。

int i = bar.operator()<int>();
于 2013-02-21T22:27:06.987 に答える
2

次のような変換演算子でトリックを使用できます。

struct foo
{
  struct inner {
    template <typename T> operator T() const { return 5; }
  };
  inner operator()() const { return inner(); }
};

foo bar = {};
int main()
{
  int i = bar(); // implicit
  auto x = static_cast<int>(bar()); // "explicit" template parameter
}

bar<int>()まったく同じ構文は不可能だと思います。

于 2013-02-21T22:30:11.003 に答える
0

たぶん、あなたはこのようにあなたの解決策を単純化することができます:

template<class T>
struct foo
{
        T operator()() const
        {
            return 5;
        }
};

foo<int> bar = {};

int main()
{
    int i = bar();
    return 0;
}
于 2013-02-22T11:59:47.013 に答える