私はC++のテンプレートについて学んでいたので、私はそれらを動作させることができるかどうかを確認するために、いくつか異常な状況に遭遇することにしました。 (いいえ、それは実用的ではありません - ただ言語を使って遊ぶことです)タイプT
の値を保持するテンプレートクラスを作成し、std::pair
をT
に返し、パラメータの値のうち最大値の1つを返すバリデーション関数テンプレートを使用しましたパック。しかし、私はそれをコンパイルすることはできません。 source.cppで 非可変テンプレートクラス内に可変テンプレート関数を作成するにはどうすればよいですか?
#ifndef HEADER_H
#define HEADER_H
#include <utility>
#include <algorithm>
#include <array>
template <typename T>
class MyClass
{
T m_heldType;
public:
MyClass(T t) : m_heldType(t) {}
template <typename... T2>
std::pair<T, T2> pairingFunc(T2&&... types)
{
std::array<T2, sizeof...(types)> types_arr = { types... };
return std::make_pair(m_heldType, *std::max_element(types_arr.begin(), types_arr.end()));
}
};
#endif
:ここ
はがheader.hで...私が書いたものだ
#include <iostream>
#include "Header.h"
int main()
{
MyClass<int> mc(512);
auto mypair = mc.pairingFunc(1.61f, 3.14f, 6.66f);
std::cout << mypair.first << ' ' << mypair.second;
std::cin.ignore();
}
これらは私が生成するエラーです。
Error C3520 'T2': parameter pack must be expanded in this context ...\header.h 24
Error C2672 'MyClass<int>::pairingFunc': no matching overloaded function found ...\source.cpp 8
Error C2893 Failed to specialize function template 'std::pair<T,T2> MyClass<T>::pairingFunc(T2 &&...)' ...\source.cpp 8
Error C3536 'mypair': cannot be used before it is initialized ...\source.cpp 10
Error C2228 left of '.first' must have class/struct/union ...\source.cpp 10
Error C2228 left of '.second' must have class/struct/union ...\source.cpp 10
だから、ここで私が考えているものです:
- は明らかに、コンパイラは
mypair
の種類を判別することはできません(初期化に失敗)。しかし、なぜ?T
のタイプはMyClass
、T2
のタイプはpairingFunc()
です。明示的にstd::pair<int, float>
と記載するとこのエラーは修正されますが、他のもの(根本的な問題の症状)は残ります。 - "関数テンプレートを特殊化できませんでした" ...指定した型に基づいて型を返すことができなかったと思いますか?もしそうなら、どうしてですか?
- "このコンテキストではパラメータパックを展開する必要があります" - これについてはわかりません。パックを配列に入れてもそれは起こりませんか?
また、私が(T2&& head, T2&&... tail)
のようなものを介して、少なくとも1つの引数の提供を強化したいと思いますが、私は、配列またはベクターにそれらの両方を得ることは厄介なことができると思いますし、私が対処するかどうかはわかりませんそれはただ一つのバリデーショナルである。それはちょうど私が推測する「ボーナス」です。
また、配列の型に 'std :: common_type_t'を、戻り型の2番目のメンバを使用するのが適切かもしれません。 –
@DanielSchepler良いアイデアは、 'std :: common_type'、感謝について知りませんでした: – Rakete1111
@ Rakete1111あなたの答えをありがとう!私は、「T2」を参照すると、単に「T2の型の配列」を意味し、パラメータパック全体ではないと仮定しました。それは私が(頭、尾...)考えに近づいていたことを意味します。加えて、「少なくとも1つのargを持つ必要があります」という制限と1回のタイピングが追加されています。再度、ありがとう、これは明確で、ポイントの答えでした。 –