我想声明一个模板如下:
template <typename T>
{
if objects of class T have method foo(), then
const int k=1
else
if class has a static const int L then
const int k=L
else
const int k=0;
}
我该怎么做?一般来说,我想要一个设置静态consts的机制 基于T的属性(或T中定义的typedef)。
答案 0 :(得分:5)
外部部分当然很容易。使用boost :: mpl :: if_来决定从元函数返回哪个int_type,然后访问其中的值。没什么大不了的。
你试图找出类型X是否具有函数f()的部分仍然相当直接但不幸的是你找不到通用的答案。每当你需要这种检查时,你必须编写一个自定义元函数来找出它。使用SFINAE:
template < typename T >
struct has_foo
{
typedef char (&no) [1];
typedef char (&yes) [2];
template < void (T::*)() >
struct dummy {};
template < typename S >
static yes check( dummy<&S::foo> *);
template < typename S >
static no check( ... );
enum { value = sizeof(check<T>(0)) == sizeof(yes) };
};
编辑:哦,用BOOST_MPL_HAS_XXX()
为你的静态const L创建一个检查器答案 1 :(得分:0)
很难说当前形式的答案,因为问题领域不明确。
但是,您可以尝试使用type traits technique,它通过添加仅针对类型为T
的对象的参数来增强模板化类。
我很确定,使用类型特征可以解决您的问题,仍然使用它们并编写/使旧例程通用有时会变得棘手。
答案 2 :(得分:0)