我想强制模板实例化。
以下代码1在g ++(http://coliru.stacked-crooked.com/a/33986d0e0d320ad4)上可以正常工作(打印)。
但是,它0在Visual C ++(https://rextester.com/WGQG68063)上打印错误的结果()。
#include <iostream>
#include <string>
template <int& T>struct NonTypeParameter { };
//internal implementation
int lala=0;
template <typename T> struct Holder{
static int init;
};
template <typename T> int Holder<T>::init = lala++;
//tool for user
template <typename T> struct InitCRTP{
using dummy=NonTypeParameter<Holder<T>::init>;
};
class WantInit : public InitCRTP<WantInit>{};//user register easily
int main(){
std::cout << lala << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
是Visual C ++编译器错误还是一种未定义的行为?
如果它是Visual C ++错误,如何解决(同时仍保持美观)?
编辑:更改类->结构,建议使用Max Langhof(和很多人)。谢谢。
如何在检测到编译错误时停止Visual Studio 2015的编译?
我的意思是第一个构建错误(可能是第一个.cpp),而不是第一个项目,因为它需要太多时间.
(我只有一个项目.)
名为" StopOnFirstBuildError "的扩展名不是答案,
因为它会在第一个出错的项目上停止.
(更详细)
当我按F5或时Ctrl+Shift+B,编译器将编译所有(或一些)文件.
在我的情况下,它只使用5秒就可以检测到一些错误,所以我希望它立即停止编译.
但是,VS 2015变得没有响应.
它也有很强的抵抗力Ctrl+Break.
我需要大约30秒才能导航到错误位置.
如何自动停止第一次编译错误的编译过程?
有一个旧的线程询问Visual Studio 2008这个.
它最常被接受的解决方案是去: -
Visual Studio -> Tools -> Macros -> Macro IDE... (or ALT+F11)
Run Code Online (Sandbox Code Playgroud)
并粘贴一段代码.
但是,VS 2012中不再支持宏.
(我试图按Alt+F11VS 2015,没有宏编辑器/菜单出现.)
该声明与VS 2010的问题一致,表明上述技巧不起作用.
VS2010问题的解决方案是安装名为" CancelFailedBuild "的扩展.
因此,我下载了它.
执行时.vsix …
我有一个中等大小的代码库(> 200 .cpp),它使用一个函数hashCode()来返回哈希值: -
class B01{ //a class
//..... complex thing ....
public: size_t hashCode(){ /* hash algorithm #H01 */}
};
class B02{ //just another unrelated class
//..... complex thing ....
public: size_t hashCode(){/* #H02 */} //This is the same name as above
};
Run Code Online (Sandbox Code Playgroud)
我已在各种位置使用它,例如在我的自定义数据结构中.它运作良好.
现在,我想让std::数据结构识别哈希算法: -
这是我应该做的: - (从cppreference修改,我将调用此代码#D).
//#D
namespace std {
template<> struct hash<B01> {
std::size_t operator()(const B01& b) const {
/* hash algorithm #H01 */
}
}; …Run Code Online (Sandbox Code Playgroud) C++中是否存在非静态块?
如果不是,如何优雅地模仿它?
我想替换类似的东西: -
class C{
public: void ini(){/* some code */}
};
class D{
std::vector<C*> regis; //will ini(); later
public: C field1;
public: C field2;
public: C field3; //whenever I add a new field, I have to ... #1
public: D(){
regis.push_back(&field1);
regis.push_back(&field2);
regis.push_back(&field3); //#1 ... also add a line here
}
public: void ini(){
for(auto ele:regis){
ele->ini();
}
}
};
Run Code Online (Sandbox Code Playgroud)
与: -
class D{
std::vector<C*> regis;
public: C field1;{regis.push_back(&field1);}//less error-prone (because it is on-site)
public: C field2;{regis.push_back(&field2);}
public: …Run Code Online (Sandbox Code Playgroud) 默认模板参数是否可以以不从右开始的方式使用"默认值"?
标准是什么?
编译器将如何解释?
例如,我很惊讶这段代码有效.
#include <iostream>
using namespace std;
template <bool T=true, class U> //"default" from LEFT-most parameter
void f(U u){
if(T){ cout<<true;}
else cout<<false;
}
int main() {
auto x = []( ){ };
f(x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这里查看现场演示:https://ideone.com/l6d9du
有没有办法伪造它?
是否有任何可以模拟最接近行为的C++宏/模板/魔术?
Util.h (图书馆)
class Util{
//note: by design, this Util is useful only for B and C
//Other classes should not even see "Util"
public: static void calculate(); //implementation in Util.cpp
};
Run Code Online (Sandbox Code Playgroud)
Bh (图书馆)
#include "Util.h"
class B{ /* ... complex thing */ };
Run Code Online (Sandbox Code Playgroud)
Ch (图书馆)
#include "Util.h"
class C{ /* ... complex thing */ };
Run Code Online (Sandbox Code Playgroud)
Dh (用户)
#include "B.h" //<--- Purpose of #include is to access "B", but not "Util"
class D{
public: static …Run Code Online (Sandbox Code Playgroud) 这是解决方案资源管理器中显示的Visual Studio中我的项目的过滤器: -
ProjectName1
== References, External Dependencies, Header Files, Resource Files
== Source Files
==== myFilter01
------ K.h (system folder = `D:\ProjectName1\K.h`)
------ K.cpp (system folder = `D:\ProjectName1\K.cpp`)
==== myFilter02
====== subFilter2_1
--------- B.h (system folder = `D:\ProjectName1\B.h`)
--------- B.cpp (system folder = `D:\ProjectName1\B.cpp`)
========= subFilter2_2
----------- C.h (system folder = `D:\ProjectName1\C.h`)
----------- C.cpp (system folder = `D:\ProjectName1\C.cpp`)
ProjectName2
== ... (some existing filter/files)
Run Code Online (Sandbox Code Playgroud)
(在实际情况中,所有过滤器都包含许多子过滤器和文件.)
如何 :
.h与.cpp文件(B …Visual Studio是否具有Microsoft Word中的选项卡自定义功能?
它对于一些脏重构(例如块编辑)也很有用.
有了这个功能,我不再需要space space space/ tab tab tab手动使其非常像: -
在Microsoft Words中,我可以指定选定的行以使用标签的自定义位置: -
它的工作方式如下(->是制表符): -
VTT解决方案推荐的代码对齐扩展不适用于此代码: -
std::vector<int> cat =std::vector<int>() ;
float zombie=5;
Run Code Online (Sandbox Code Playgroud)
我希望它的格式如下: -
std::vector<int> cat = std::vector<int>() ;
float zombie = 5;
Run Code Online (Sandbox Code Playgroud)
但这是结果(充其量): -
std::vector<int> cat =std::vector<int>() ;
float zombie =5;
Run Code Online (Sandbox Code Playgroud)
这是一个更类似于真实案例的例子: -
MyArray<ManagerAAC > packAAC =create (userData);
MyArray<ManagerANC > packANC =createANC ( userData);
MyArray<ManagerAIC > packAIC =createAIC (userData );
MyArray< ManagerNDX<1>> packNDX1=generate<1>(userData);
MyArray<ManagerNDX<2>> packNDX2=generate<2>(userData);
MyArray<ManagerNDX<3>> packNDX3=generate<3> (userData); …Run Code Online (Sandbox Code Playgroud) 我成功地传递了一个函数作为参数.
// this is in a scope of a normal function
class DummyClass{
public: static int dummyFunction(G& goo){
return goo.doSomething (); //non-static function
//Edit 3: it calculates hash value
}
};
AMap<G,int,DummyClass::dummyFunction>map;
//... do some other thing
Run Code Online (Sandbox Code Playgroud)
那些Dummy降低了代码的可读性.
我可以用更简洁的方式打电话吗?
AMap<G,int,
[](G&goo)->int{ return goo.doSomething (); }
>map;
Run Code Online (Sandbox Code Playgroud)
我试过,但编译说
expected compile-time constant expression
Run Code Online (Sandbox Code Playgroud)
看起来编译器认为lambda函数不是编译时常量,但我确信它的行为是.
我已阅读如何使用lambda表达式作为模板参数?,但没有解决方案可以提供1语句的方式.
如果我可以称之为,我会是理想的
AMap<G,int, G::doSomething >map; //note that G::doSomething is non-static
Run Code Online (Sandbox Code Playgroud)
编辑
这就是我宣布AMap的方式
template<class K,class T,int (* K_uniqueHash)(K&) >AMap {//<--- can be changed
private: int getIndex(K& k){ …Run Code Online (Sandbox Code Playgroud) 如果我重命名属性表,则将更改属性表的文本.
但是,属性表的文件名不会更改.
如何自动更改文件名和文本?
首先,我创建foo工作表.
它将保存为foo.props.
在那之后,我觉得foo是不是一个合适的名称,所以我重新命名foo,以bar在项目经理: -
(从左至右)
但是,foo.props-file仍然存在,不会bar.props自动重命名: -
因此,当我想添加bar到任何配置时,我的眼睛必须foo.props在系统文件夹中搜索.(实际上,我应该搜索bar.props.)
这很容易出错.
这种不一致让我很紧张.
每当我重新命名它,我必须删除旧foo.props的窗口资源管理器中手动,然后保存bar工作表作为一个新的bar.props手动.
但是,我的项目中的其他工作表参考将被打破.
我将不得不再次添加bar.props所有相关项目的所有相关配置,否则项目将无效(unloadable):找不到foo.props.
有没有更好的工作流程?它是什么?
c++ ×10
templates ×3
c++11 ×2
c++14 ×1
c++17 ×1
g++ ×1
hash ×1
non-static ×1
readability ×1
sfinae ×1
tabs ×1
visual-c++ ×1