我的代码中有字符串标记,它们被转换为数字并用于在标记值结构中搜索值.
我有这样的事情:
void foo()
{
type value = search("SomeTag");
}
Run Code Online (Sandbox Code Playgroud)
搜索定义如下:
type search(const char* tag)
{
return internal_search(toNumber(tag));
}
Run Code Online (Sandbox Code Playgroud)
因为所有时间标记在编译时都是常量,所以我想删除将标记转换为搜索函数中的数字的调用.我知道可以在编译时使用模板(http://en.wikipedia.org/wiki/Compile_time_function_execution)执行一些简单的函数,但我不知道如何迭代空终止字符串并保留中间值在模板中.你能给出一个简单的样本来迭代一个空终止的字符串,并在一个公共变量中添加字符吗?
是否可以根据模板条件声明成员变量而不使用虚拟空类型?
例:
struct empty{};
struct real_type{};
template<bool condition>
struct foo
{
typename std::conditional<condition, real_type, empty>::type _member;
};
Run Code Online (Sandbox Code Playgroud) 考虑en.cppreference.com关于的引用std::vector::emplace_back
"将一个新元素追加到容器的末尾.该元素就地构造,即不执行复制或移动操作.使用提供给函数的完全相同的参数调用元素的构造函数."
以下样本:
#include <vector>
struct A
{
A(int){}
A(A const&) = delete;
};
int main()
{
std::vector<A> vec;
vec.emplace_back(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在线vec.emplace_back(1);Visual Studio 2013/GCC报告:
错误C2280:'A :: A(const A&)':尝试引用已删除的函数
错误:使用已删除的函数'A :: A(const A&)'
错误是否正确?你能解释一下为什么吗?
我有这些课程:
class Base
{
public:
virtual void foo(int x = 0)
{
printf("X = %d", x);
}
};
class Derived : public Base
{
public:
virtual void foo(int x = 1)
{
printf("X = %d", x);
}
};Run Code Online (Sandbox Code Playgroud)
当我有:
Base* bar = new Derived();
bar->foo();Run Code Online (Sandbox Code Playgroud)
我的输出是"X = 0",即使从Derived调用foo,但是当我有:
Derived* bar = new Derived();
bar->foo();Run Code Online (Sandbox Code Playgroud)
我的输出是"X = 1".这种行为是否正确?(从声明类型中选择默认参数值,而不是从实际对象类型中选择它).这会打破C++多态吗?
如果某人使用虚函数而未指定实际的函数参数并使用函数的默认参数,则会导致许多问题.
我有这个
可以设计类foo,但不是文件中的第一个类
在我的C#文件中添加从TextBox派生的foo类后出错.我怎么能通过它,这很烦人.
编辑:
我想在我的文件中有多个类.我希望从TextBox派生一些接受特定类型输入的类.我没有使用设计师.
EDIT2:
class NumericTextBox : TextBox
{
protected override void OnTextChanged(EventArgs e)
{
...
}
}
Run Code Online (Sandbox Code Playgroud) 我试图从成员函数做一些回调,一切都很好,直到我尝试使用从2个类派生的模板类作为回调对象时,我得到以下错误:
error C2440: 'reinterpret_cast' : Pointers to members have different representations; cannot cast between them
Run Code Online (Sandbox Code Playgroud)
这件事告诉我,成员函数指针有不同的表示形式(doh!)
这些陈述是什么?他们之间有什么区别?
是否有可能实现这样的目标:
template<typename Signature>
class Test
{
public:
//here I want operator () to respect the signature
};
Test<void(int)> t1; //void operator()(int)
Test<void(int, float)> t2; //void operator()(int, float)
Run Code Online (Sandbox Code Playgroud)
返回类型总是如此void.
我想发送函数签名作为模板参数.这可能吗?我不能使用可变参数模板,因为我的编译器还不支持此功能.
我知道为了从命令行获取xcode安装目录,我必须使用xcode-select -print-path.结果如下:/Applications/Xcode.app/Contents/Developer
是否有任何命令来获取最新的SDK文件夹?我需要结果如下:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/
如果无法获得SDK完整路径,我至少需要SDK编号,我将尝试构建路径.
考虑以下代码:
template<typename T>
struct A
{
void f(){...}
friend T;
};
template<typename T>
struct B
{
void f(T){...}//code depends on T
void g(){...}//code doesn't depends on T
}
Run Code Online (Sandbox Code Playgroud)
如您所见,"代码"中的"代码" struct A不依赖于T.编译器是否会在每个T用于实例化的最终二进制文件中生成不同的代码A?
同样的B::g()功能问题,编译器是否会在B<T>可能的情况下对所有实例使用相同的函数,例如this未使用g(),因此不依赖于T?该标准是否有针对此案例的任何规范?
std::list迭代器有一些非常好的属性 - 当删除任何其他元素,添加新元素时,甚至当交换2个列表时,它们仍然有效(迭代器失效规则)!
考虑以下代码行为并且迭代器是通过指向实际节点的指针的形式实现的,当移动列表时,该指针不会改变,我猜测迭代器在std::list移动a时在新容器中仍然有效,而且我可以通过访问实际具有"预期"值的无效内存进入UB区域.
std::list<int> l1{3, 2, 1};
std::list<int> l2;
auto it = std::prev(l1.end());
std::cout<<l1.size()<<" "<<l2.size()<<" "<<*it<<std::endl;
l2 = std::move(l1);
std::cout<<l2.size()<<" "<<*it<<std::endl;
3 0 1
3 1
Run Code Online (Sandbox Code Playgroud)
如果std::list移动时迭代器保持有效,它是否由标准保证?其他容器怎么样?