あなたは解決するための関数宣言(定義は、この場合に必要とされていない)、std::declval
とstd::integral_constant
のカップルを使用することができますそれはコンパイル時に。上記溶液はT
という名前のデータメンバPosition
Vec2
又はVec3
のいずれかであるの種類をしていない場合はコンパイルに失敗し
#include<type_traits>
#include<utility>
struct Vec2 {};
struct Vec3{};
struct Shape2D { Vec2 Position; };
struct Shape3D { Vec3 Position; };
template<class T>
class Test {
static constexpr std::integral_constant<int, 1> method1(Vec2);
static constexpr std::integral_constant<int, 2> method1(Vec3);
public:
constexpr int method1() {
return decltype(method1(std::declval<T>().Position))::value;
}
};
int main() {
Test<Shape2D> ta;
Test<Shape3D> tb;
static_assert(ta.method1() == 1, "!");
static_assert(tb.method1() == 2, "!");
}
:
最小の、実施例に続きます。
この可能性が代わりにデフォルト値を必要とする別の可能なアプローチ:
constexpr int method1() {
return
(std::is_same<decltype(std::declval<T>().Position), Vec2>::value
? 1 : (std::is_same<decltype(std::declval<T>().Position), Vec3>::value
? 2 : 0));
}
std::is_same
と組み合わせて使用する三項演算子、より多くの何もないです。
あなたがC++ 17を使用することができれば、あなたもif/else constexpr
にあなたのソリューションをベースにすることができます
constexpr int method1() {
if constexpr(std::is_same_v<decltype(std::declval<T>().Position), Vec2>) {
return 1;
} else if constexpr(std::is_same_v<decltype(std::declval<T>().Position), Vec3>) {
return 2;
}
}
多型ではなく、テンプレートに関連する問題。 shape3dとshape2dを形から派生させることは可能でしょうか? –
すべては、ここで達成したいと思うものによって異なります。適切なクラスが作成されているかどうかをテストしたいだけですか? –
こんにちは。できるだけシンプルに問題を解決しようと多くの努力をしましたが、実際にはそれとはまったく異なっていました。手元に問題がある場合は、オーバーロードが最善の解決策です。 – alcoforado