假设我有一组标志和类似这样的类:
/// <summary>Options controlling a search for files.</summary>
enum class FindFilesOptions : unsigned char
{
LocalSearch = 0,
RecursiveSearch = 1,
IncludeDotDirectories = 2
};
class FindFiles : boost::noncopyable
{
/* omitted */
public:
FindFiles(std::wstring const& pattern, FindFilesOptions options);
/* omitted */
}
Run Code Online (Sandbox Code Playgroud)
我希望调用者能够选择多个选项:
FindFiles handle(Append(basicRootPath, L"*"),
FindFilesOptions::RecursiveSearch | FindFilesOptions::IncludeDotDirectories);
Run Code Online (Sandbox Code Playgroud)
是否可以使用C++ 11以强类型方式支持它enum class,或者我是否必须恢复为无类型枚举?
(我知道调用者可以static_cast使用底层类型并static_cast返回,但我不希望调用者必须这样做)
我通常使用enum'bit-or'或|一起允许对象有一些选项.如何让enum类使用'bit-or'功能?
有没有办法使用替换失败不是枚举的错误(SFINAE)?
template <typename T>
struct Traits
{
}
template <>
struct Traits<A>
{
};
template <>
struct Traits<B>
{
enum
{
iOption = 1
};
};
template <T>
void Do()
{
// use Traits<T>::iOption
};
Run Code Online (Sandbox Code Playgroud)
然后,Do<B>();工作和Do<A>();失败.但是,当iOption不存在时,我可以提供默认行为.所以我将Do to DoOption的一部分分开了.
template <typename T, bool bOptionExist>
void DoOption()
{
// can't use Traits<T>::iOption. do some default behavior
};
template <typename T>
void DoOption<T, true>()
{
// use Traits<T>::iOption
};
template <T>
void Do()
{
// 'Do' does not use …Run Code Online (Sandbox Code Playgroud)