私は、テンプレートパラメータを特定のパラメータで構築できるかどうかによって、異なる専門化を持つサンプルクラスを作成しようとしています。私のサンプルでは、単純なint
と。私は試しました:SFINAEコンストラクタパラメータ
template<class A_t>
struct creator
{
A_t* ptr = nullptr;
};
template<class A_t>
struct creator<decltype(A_t(int()))>
{
A_t* ptr = new A_t(5);
};
struct A
{
int i;
A(int i) : i(i) {}
};
int main() {
std::cout << creator<A>().ptr << std::endl;
return 0;
}
私が意図したのは、自動的に構築されたオブジェクトのメモリアドレスを出力することです。しかし、それは0をプリントしている。だから、それは非特殊なテンプレートを取っている。
A_t
は、特に、A_t
が明示的に指定されているため、その構文で推論できます。また、decltype(A_t(int())
(たとえばなくA_t&&
)A_t
型を持つ、単純なテスト:
std::cout << std::is_same<decltype(A(int()), A>::value << std::endl;
プリント1.
しかし、その実装が動作する2つのクラスで
#include <iostream>
template<class A_t, class = A_t>
struct creator
{
A_t* ptr = nullptr;
};
template<class A_t>
struct creator<A_t, decltype(A_t(int()))>
{
A_t* ptr = new A_t(5);
};
struct A
{
int i;
A(int i) : i(i) {}
};
int main() {
std::cout << creator<A>().ptr << std::endl;
return 0;
}
Coliru試験1つはパラメータとしてint
を受け取り、もう1つは受け入れません。
なぜ最初の方法が機能しないのですか?
"A_tはその構文で推論可能です" - [明らかにclangはあなたと意見が違う](http://coliru.stacked-crooked.com/a/ef8e660b39987927)。私は理由について考える必要があるだろう(会議では注意を払うことになっている= P)。 – WhozCraig