2016-06-08 35 views
5

我知道这不是一个非常尖锐的问题。是否有优势(编译时间,依赖关系,调试符号大小,可用性,可读性等)使用一个优先?继承自std :: true_type vs static constexpr const布尔成员

template < typename T > 
struct IsSharedPtr : std::false_type 
{ 
}; 

VS

template < typename T > 
struct IsSharedPtr 
{ 
    static constexpr bool value = false; 
}; 

一个相关的问题...

template < typename T, typename Enabler > 
struct S; 

template < typename T > 
struct S < T, std::true_type >{}; 

template < typename T > 
struct S < T, std::false_type >{}; 

VS

template < typename T, bool enabler > 
struct S; 

template < typename T > 
struct S < T, true >{}; 

template < typename T > 
struct S < T, false >{}; 

回答

6

来自继承true_type/false_type就已经为你提供合作对应的value成员,函数调用操作符和隐式转换为bool。此外,如果你会使用继承,你的类型将有资格获得标签调度,这往往比SFINAE更清晰,更容易:

namespace detail 
{ 
template <typename T> 
void do_work(T& foo, std::true_type); 

template <typename T> 
void do_work(T& foo, std::false_type); 
} 

template <typename T> 
void do_something(T& foo) 
{ 
    //Selects overload depending on type of IsSharedPtr<T> 
    detail::do_work(foo, IsSharedPtr<T>{}) 
} 
+0

注意你也可以派遣上第二个模板参数,这可能是有点严格,因为类型(特征)转换不涉及选择功能。 – rubenvb