C++ C++;如何在可移植代码中处理tr1和非tr1名称空间?

C++ C++;如何在可移植代码中处理tr1和非tr1名称空间?,c++,boost,namespaces,tr1,typetraits,C++,Boost,Namespaces,Tr1,Typetraits,在尝试维护TR1和非TR1工具链之间的可移植代码时,是否有一种规范的方法来处理出现的命名空间问题 我有一个VC++2010项目,包括。我还有一个LLVM3.0编译器,可以很好地处理这个问题。这允许我使用以下模板: std::enable_if<typename> std::is_enum<typename> 此编译器似乎没有包含文件,而是有一个。但是,这给我带来了问题,因为名称空间已从std::更改为_gnu_cxx::,这意味着我必须使用: __gnu_cxx::__

在尝试维护TR1和非TR1工具链之间的可移植代码时,是否有一种规范的方法来处理出现的命名空间问题

我有一个VC++2010项目,包括。我还有一个LLVM3.0编译器,可以很好地处理这个问题。这允许我使用以下模板:

std::enable_if<typename>
std::is_enum<typename>
此编译器似乎没有包含文件,而是有一个。但是,这给我带来了问题,因为名称空间已从std::更改为_gnu_cxx::,这意味着我必须使用:

__gnu_cxx::__enable_if<typename>
但这似乎更像是一种黑客行为,而不是一个合适的解决方案。(实际上,我尝试了这个方法,但它不起作用,因为尝试使用
\uu gnu\u cxx::\uu enable\u如果
导致此错误:

error: too few template arguments for class template '__enable_if'
  • 进一步挖掘表明,这个版本的enable_if实际上需要两个模板参数。我现在非常迷茫……)
我想做一些事情,比如:

#ifdef __GLIBCXX__
# include <tr1/type_traits>
namespace __gnu_cxx = foo; 
#else
# include <type_traits>
namespace std = foo;
#endif

... foo::enable_if< ... >
但是,这在Xcode 4.5中给了我以下编译器错误:

error: expected a qualified name after 'typename'
  class Extractor <ValueType, typename boost::enable_if<boost::is_enum<ValueType>::value>::type> {
                                                                                           ^
error: unknown type name 'type'
错误:“typename”后应为限定名
类提取器{
^
错误:未知的类型名称“type”

因此,std::enable_if和boost::enable_if似乎不兼容。

我将回答我自己的问题,因为我使用了
boost::enable_if_c
(注意,替换
std::enable_if
的是
boost::enable_if_c
,而不是
boost::enable_if

#包括
#包括
//除了我的一个环境不包含
//太包容了。最好(对我来说)使用上面更具体的包容。
//#包括
模板
类提取器{
公众:
ValueType提取(双值){
返回static_cast(static_cast(value));//首先转换为int,然后是enum,以满足VC++2010的要求
}
};

然而,我仍然很好奇,是否有比使用Boost更好的方法来处理这个问题。

这个问题是使用Boost/type_traits.hpp的Got something的后续问题-但是请注意,需要使用Boost::enable_if_c作为std::enable_if的替代品-或者显然可以删除后面的::值-请参阅“更多信息”,第2节,不幸的是,这里是swings-n-Roundounds-boost/type_traits.hpp includes是_complex.hpp,其中包括-不幸的是,在这个特殊的地方不存在(减少)编译环境.Gah.解决了这一问题,包括而不是-很高兴Boost创建者将所有内容进行了有效的拆分-handy。你知道我还有希望。是的,我遇到了Boost.TR1,尽管由于std::enable_if和Boost::enable_if_c之间的不匹配,我很难让它工作。我的理解是可以只包含boost/tr1.hpp,它将所有内容添加到std::,但这似乎不起作用。我会再试一次……我在自己的C++11后台端口库中所做的事情——例如(准确地说)
enable_if
,就是在命名空间
std
中正确地实现(或
使用
)所有内容。然后如果我检测到有一个tr1命名空间(或者,即使不是,以防万一),我打开它,然后使用
将其放入命名空间std中,以方便地对工具进行转发兼容访问。这只会留下
散列
专门化之类的问题,这将要求TR1工具本身在命名空间
std
中实现。
#ifdef __GLIBCXX__
# include <tr1/type_traits>
namespace __gnu_cxx = foo; 
#else
# include <type_traits>
namespace std = foo;
#endif

... foo::enable_if< ... >
#include <boost/type_traits.hpp>

template <typename ValueType>
class Extractor <ValueType, typename boost::enable_if<boost::is_enum<ValueType>::value>::type> {
 public:
  ValueType extract(double value) {
    return static_cast<ValueType>(static_cast<int>(value));  // cast to int first, then enum, to satisfy VC++2010
  }
};

enum MyEnum { Enum0, Enum1 };
Extractor<MyEnum> e;
MyEnum ev = e.extract(1.0);
error: expected a qualified name after 'typename'
  class Extractor <ValueType, typename boost::enable_if<boost::is_enum<ValueType>::value>::type> {
                                                                                           ^
error: unknown type name 'type'
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_enum.hpp>

// this would work except one of my environments doesn't contain <complex> so it's
// too inclusive. Better (for me) to use the more specific includes above.
// #include <boost/type_traits.hpp>  

template <typename ValueType>
class Extractor <ValueType, typename boost::enable_if_c<boost::is_enum<ValueType>::value>::type> {
 public:
  ValueType extract(double value) {
    return static_cast<ValueType>(static_cast<int>(value));  // cast to int first, then enum, to satisfy VC++2010
  }
};