具有 boost::hana 的 SFINAE 模板构造函数
SFINAE template constructor with boost::hana
给定以下代码,使用 Boost hana 表达相同功能的合适方法是什么?
#include <type_traits>
#include <boost/hana/type.hpp>
#include <boost/hana/core/when.hpp>
namespace hana = boost::hana;
struct S {
template<
typename T,
typename = typename std::enable_if_t< (T::value) > > // <-- equivalent?
S (const T&) { }
};
struct X { static constexpr int value = 0; };
struct Y { static constexpr int value = 1; };
int main () {
S a (X { }); // <-- must fail
S b (Y { });
return 0;
}
when
的文档提到它是 enable_if
的替代品,但我不确定如何在这种情况下应用它。那么,如何使用 Boost hana 有选择地启用模板构造函数?
正如@Barry 在评论中所说,hana::when
对于部分专业化很有用,但不能用于您的情况。 Hana 没有提供比您已有的更简洁的咒语(这是公平的,因为它是单行的)。另请注意,您可以从 std::enable_if_t
.
中删除额外的 typename
关键字
给定以下代码,使用 Boost hana 表达相同功能的合适方法是什么?
#include <type_traits>
#include <boost/hana/type.hpp>
#include <boost/hana/core/when.hpp>
namespace hana = boost::hana;
struct S {
template<
typename T,
typename = typename std::enable_if_t< (T::value) > > // <-- equivalent?
S (const T&) { }
};
struct X { static constexpr int value = 0; };
struct Y { static constexpr int value = 1; };
int main () {
S a (X { }); // <-- must fail
S b (Y { });
return 0;
}
when
的文档提到它是 enable_if
的替代品,但我不确定如何在这种情况下应用它。那么,如何使用 Boost hana 有选择地启用模板构造函数?
正如@Barry 在评论中所说,hana::when
对于部分专业化很有用,但不能用于您的情况。 Hana 没有提供比您已有的更简洁的咒语(这是公平的,因为它是单行的)。另请注意,您可以从 std::enable_if_t
.
typename
关键字