web-dev-qa-db-ja.com

テンプレートで正しいタイプのデータを返す方法は?

#include <iostream>
using namespace std;

template <class X, class Y>
Y big(X a, Y b)
{
   if (a > b)
      return (a);
   else return (b);
}

int main()
{
   cout << big(32.8, 9);
}

ここではCPPでテンプレートを使用しているので、bigおよびdoubleタイプの引数をバイパスして関数intを呼び出すと、doubleである返答が必要です。ここの型は、32ではなく32.8を返します。

希望する出力を取得するにはどうすればよいですか? big関数の適切な戻り値の型を記述する方法?

9

これは、おそらくあなたの正確な状況に対する正しい解決策ではありません。他の答えは、あなたが望むものに非常に近い可能性があります。

ただし、reallyが何らかの理由で実行時に完全に異なる型を返す必要がある場合、正しい解決策(- c ++ 17 =)は std::variant 、これは一種のタイプセーフな共用体です。

#include <variant>

template <typename X, typename Y>
std::variant<X, Y> max(X a, Y b) {
  if (a > b)
    return std::variant<X, Y>(std::in_place_index_t<0>, a);
  else
    return std::variant<X, Y>(std::in_place_index_t<1>, b);
}

その場合、責任は呼び出し側が戻り値を処理することであり、おそらく std::visit など。

2
N. Shead