小编gex*_*ide的帖子

C++ 11 static_assert(以及其中使用的函数)

static_assert 似乎是一个非常好的功能与模板.

但是,我无法在标准库中查找函数,以便在编译时进行各种测试.

例如,我正在寻找一个函数来检查类型是否是另一个类型的子类型.boost::is_base_of但是,这项工作在std中是一个类似的功能,所以我不需要依赖boost.

基本上,是否有一个很好的源代码可以在static_assertC++ 11的标准库中使用并包含在函数列表中?

什么时候static_assert执行?我可以将它放在模板中的任何位置,并针对每个模板实例进行评估吗?它可以用来将模板参数约束为类的特定子类型吗?

c++ static-assert assertions c++11

1
推荐指数
2
解决办法
2612
查看次数

C++单一构造函数模板专业化

对不起,如果这是一个骗局.有许多类似的问题,但似乎没有人真正解决这个问题.他们都有点不同.

所以我想要实现的目标:考虑一个模板类X<T>.现在,我想要一个额外的构造函数为该模板的特定instanciattion延伸,让我们说指针X<T*>.我不想创建一个完整的模板规范X<T*>,因为它X<T*>应该与通常的模板完全一样(并且该模板是巨大的,因此复制粘贴将是一个相当重复的代码复制气味),只是它有一个额外的构造函数.我也不想X<T*>继承,X<T>因为我不想在这两者之间建立子类型关系.这可能吗?我试过这样的:

template<T> class X{};

template<T> X<T*>::X(int i){...}
Run Code Online (Sandbox Code Playgroud)

但它没有编译.这有点可能吗?

c++ templates constructor template-specialization

1
推荐指数
1
解决办法
934
查看次数

有没有办法绕过模板基类成员前缀`this`?

从模板类继承时,我需要为派生类中访问的所有基类成员添加前缀this:

template<typename T>
struct X{
   int foo;
   void bar();
};

template<typename T>
struct Y : public X<T> {

   void blub(){
       foo++; // Does not work
       this->foo++; // Fine
       bar(); // Does not work
       this->bar(); // Fine
   }
}
Run Code Online (Sandbox Code Playgroud)

正如我所暗示的那样,你必须在会员面前添加前缀的原因this已在此处得到解答.所以我剩下的问题是:有没有办法避免所有的thises?例如,我在派生类中有一个使用大量基类成员的方法.代码看起来完全混乱了所有this->内容.有没有办法省略这些?

c++ templates c++11

1
推荐指数
1
解决办法
108
查看次数

超级方法调用中的C++名称冲突

假设我有以下代码:

namespace x{
    class X{
        virtual void x(){}
    }
}

namespace y{
    class Y : public x::X{
         void x(){}
    }
}

int main(){
    x::X* a = new y::Y();
    a->x::X::x(); //Tries to access x::X::x non-virtually. 
                  //Fails, since it treats the first x as the 
                  //function name instead of the namespace
}
Run Code Online (Sandbox Code Playgroud)

如您所见,main方法的最后一行尝试静态调用类x :: X的x方法(即非虚拟).但是,这会失败,因为命名空间与方法具有相同的名称(两者都命名为x).因此,编译器将第一个x视为方法名称,然后抱怨x :: X没有任何意义.

这个问题在初看起来似乎是假设的,但它确实出现在我们的代码中:命名空间不能轻易地重命名,因为它是一个大项目的命名空间.方法名称无法更改,因为它必须遵守我们的范围之外的其他超类(库类).

那么,有没有机会以某种方式消除这种语法的歧义,以便我仍然可以非虚拟地调用方法x :: X :: x?

现在,我看到的唯一解决方案是x = X,然后使用typedef.有没有typedef的解决方案吗?

c++ methods namespaces

0
推荐指数
1
解决办法
102
查看次数

C++模板解析错误

可能重复:
我必须在何处以及为何要使用"template"和"typename"关键字?

test在类中有一个静态模板方法,A它接受一个bool模板参数.当我尝试像这样调用函数时:

x = A::test<true>(...);
Run Code Online (Sandbox Code Playgroud)

解析器抱怨,因为它将<less视为小于运算符.我怎样才能告诉编译器这是一个模板实例而不是一个oprator呢?

c++ parsing templates parse-error

0
推荐指数
1
解决办法
819
查看次数