0

関数パラメーターの正確なタイプを推測するためのテンプレートを取得するのに問題があります。

この例では、callitの呼び出しは、必要なパラメーターの型を推測しません。callitAの最初の呼び出しは[int, int, int, int] を推測します。callitBの 2 回目の呼び出しは、[const int &, int &, const int &, int &] を推測します。テンプレートの特定のインスタンス化を行った場合にのみ、正しいパラメーターを取得できます。

テンプレート パラメーターを明示的に指定せずに、以下の 3 のような動作を取得するにはどうすればよいですか。それらは、関数のパラメーターから推定できる必要があります。

前もって感謝します。

void read() {}

template< typename P, typename... Args >
void read(const P & p, Args&... args) {
   // p is a constant and shall not be written to.
   read(args...);
}

template< typename P, typename... Args >
void read(P & p, Args&... args) {
   cin >> p;
   read(args...);
}

template< typename... Args >
void callitA(Args... args) {
   read( args... );
}

template< typename... Args >
void callitB(Args&... args) {
   read(args...);
}

// b is the only variable that can be returned from funk.
void funk(const int & a, int & b, const int c, int d) {
   callitA(a, b, c, d);  // 1. Args will be [int, int, int, int]
   callitB(a, b, c, d);  // 2. Args will be [const int &, int &, const int &, int &]

   // 3. Here Args will be what I want [const int &, int &, const int, int]
   callitA<const int &, int &, const int, int>(a, b, c, d);
}

void main() {
   const int a = 1;
   int b = 0;
   const int c = 3;
   int d = 4;

   funk(a, b, c, d);

   cout << b << endl;
}
4

2 に答える 2

0

すべての答えをありがとう。そこには興味深いものがたくさんあります。
残念ながら、これが私がやりたいことができるように見える唯一の方法です。

以下のプログラムは、次の出力を生成します:
int const, int, int const, int const,
int const, int, int const, int const,

重要なことは、2 番目のパラメーター 'b' のみが非定数であるため、読み取り関数をオーバーロードして、このパラメーターのみを読み取ることができるということです。

void read() {
   std::cout << '\n';
}

template <typename T>
struct type_to_string;
template <>
struct type_to_string<int&> {
   static char const* value;
};
char const* type_to_string<int&>::value = "int&";
template <>
struct type_to_string<int const&> {
   static char const* value;
};
char const* type_to_string<int const&>::value = "int const&";
template <>
struct type_to_string<int> {
   static char const* value;
};
char const* type_to_string<int>::value = "int";

template <>
struct type_to_string<int const> {
   static char const* value;
};
char const* type_to_string<int const>::value = "int const";

template< typename P, typename... Args >
void read(P&, Args&... args) {
   cout << type_to_string<P>::value << ", ";
   read( args...);
}

template< typename... Args >
void callitC(Args&... args) {
   read( args...);
}

// b is the only variable that can be returned from funk.
void funkA(const int & a, int & b, const int c, int d) {
   callitC(a, b, c, const_cast<const int &>(d));
}

// b is the only variable that can be returned from funk.
void funkB(const int & a, int & b, const int c, int d) {
   callitC<const int &, int &, const int, const int>(a, b, c, d);
}

void main() {
   const int a = 1;
   int b = 0;
   const int c = 3;
   int d = 4;

   funk(a, b, c, d);
   cout << endl;
   funkB(a, b, c, d);
}
于 2013-10-02T09:25:25.367 に答える