クラスに指定されたシグネチャを持つコンストラクタがある場合、コンパイル時にどのように検出できますか?私は次の操作を実行したいと思います。具体的には:クラスに署名付きコンストラクタがあるかどうかを検出する
class Archive
{
// (...)
template <typename T>
T Read()
{
if constexpr(HasUnarchiveConstructor<T>())
{
return T(*this); // constructor accepts reference to Factory
}
else
{
T t;
Unarchive(*this, t); // use stand alone function instead. (if this is not available either, compiling fails)
return t;
}
}
}
特定のシグネチャを持つ関数を検出するための多くの原因があります。私はしかし、コンストラクタにこれらを変換することはできません。 source 1source 2source 3以上。
template<typename T>
using HasUnarchiveConstructorImpl = decltype(std::declval<T>() + std::declval<T>());
template< typename T >
using HasUnarchiveConstructor = std::is_detected<HasUnarchiveConstructorImpl, T>;
私は私が実行するチェックにこれを拡張することができますどのように?私は機能がプラス演算子を持っているかどうかを検出するために、以下をコンパイルしたソースからの
それとも私は別のやり方でそれをやり遂げることができますか?
回答した内容を明確にしました。まだdownvoteの価値がある? –
私は投票をしなかったが、私はそれを相殺するためにupvoteします。私はあなたの実装が非常に洞察力があると感じました。 :-) –
あなたの答えは自分自身でこれを行う方法を教えてくれました。 Howardsの答えは、私がどのように多くのコードをスキップすることができるかを示しています(私はhomebrew is_detectedしか利用できません)。両方とも非常に便利でした。 –