我想禁止为具有特定类型特征的类型实例化类模板(setUp()
)。在以下示例中,我只想允许使用定义了PointCloud
的类型:
is_good
错误是:
#include <boost/core/enable_if.hpp>
class PointType1 {};
class PointType2 {};
template <typename T>
struct is_good
{
static const bool value = false;
};
template <>
struct is_good<PointType1>
{
static const bool value = true;
};
template <typename TPoint, typename boost::enable_if_c<is_good<TPoint>::value>::type = 0>
class PointCloud
{
};
int main()
{
PointCloud<PointType1> pointCloud1;
//PointCloud<PointType2> pointCloud2;
return 0;
}
据我了解,如果error: 'boost::enable_if_c<true, void>::type {aka void}' is not a valid type for a template non-type parameter
PointCloud<PointType1> pointCloud1;
^
为enable_if_c
,则::type
应将TPoint
定义为is_good<TPoint>::value
。如果是true
,则false
未定义,因此SFINAE应该启动。我还认为::type
表示这确实是一个类型参数。
任何人都可以解释为什么会这样吗?
答案 0 :(得分:2)
当您实例化is_good<TPoint>::value
时,true
为boost::enable_if_c<is_good<TPoint>::value>::type
且void
为void
。
正如错误消息所示,void
不是non-type template parameter的有效类型。
要修复错误,请为enable_if_c
指定第二个类型参数,而不是使用默认参数template <typename TPoint,
typename boost::enable_if_c<is_good<TPoint>::value, int>::type = 0>
^^^^^
private var _loggedIn = NSUserDefaults.standardUserDefaults().boolForKey("loggedIn")
public var loggedIn: Bool {
get {
return _loggedIn
}
set {
_loggedIn = newValue
NSUserDefaults.standardUserDefaults().setBool(newValue, forKey: "loggedIn")
NSUserDefaults.standardUserDefaults().synchronize()
}
}