編集:以下にマークした答えは100%正しいわけではありません。実際にはコメントにあります:using TPtr = decltype(&std::declval<T&>());
std::conditional<>
のタイプを取得するため&T
に使用しようとしてT
いoperator&()
ます。
簡単な解決策は、試すことすらせず、代わりに別のテンプレート引数を指定することです。
struct Foo
{
int operator&() { return 314; }
};
struct Bar { };
template <typename T, typename TPtr = T*>
struct A
{
T& _t;
A(T& t) : _t(t) {}
TPtr data() {
return &_t;
}
};
クライアントコードの場所
Foo foo;
A<Foo, int> aFoo(foo);
int pFooData = aFoo.data();
Bar bar;
A<Bar> aBar(bar);
Bar* pBarData = aBar.data();
しかし、私が書きたいのは次のようなものです。
template <typename T>
struct B
{
using TPtr = typename std::conditional<has_operator_address_of<T>::value, typename std::result_of<decltype(T::operator&)&()>::type, T*>::type;
T& _t;
B(T& t) : _t(t) {}
TPtr data() {
return &t;
}
};
はhas_operator_address_of
モデル化されてis_call_possible
います。クライアントコードは
B<Foo> bFoo(foo); // no need to second template argument
pFooData = bFoo.data();
しかし、その後、クラスoperator&()
はコンパイルに失敗します:
B<Bar> bBar(bar);
pBarData = bBar.data();
conditional
両方のテンプレート引数をコンパイルしたいようですので、コンパイルは失敗T
しますoperator&()
。散らかしてみましstd::enable_if
たが、だめでした。