遵循“现代 C++ 设计”的技术,我正在实现一个具有各种编译时优化的持久性库。如果模板化成员变量派生自给定类,我希望能够将函数分派给该变量:
template<class T, template <class> class Manager = DefaultManager> class Data
{
private:
T *data_;
public:
void Dispatch()
{
if(SUPERSUBCLASS(Container, T))
{
data_->IKnowThisIsHere();
}
else
{
Manager<T>::SomeGenericFunction(data_);
}
}
}
Run Code Online (Sandbox Code Playgroud)
其中 SUPERSUBCLASS 是一个编译时宏,用于确定对象继承。当然,在 T 确实从 Container 继承(或者 T 是内部类型等)的所有情况下,这都会失败,因为编译器正确地抱怨 IKnowThisIsHere() 不是数据成员,即使永远不会遵循此代码路径,使用 T = int 进行预处理后如下所示:
private:
int *data_;
public:
void Dispatch()
{
if(false)
{
data_->IKnowThisIsHere();
Run Code Online (Sandbox Code Playgroud)
编译器明显抱怨这段代码,即使它永远不会被执行。使用dynamic_cast的建议也不起作用,因为在编译时再次尝试进行类型转换是不可能的(例如使用T=double,std::string):
void Dispatch()
{
if(false)
{
dynamic_cast<Container*>(data_)->IKnowThisIsHere();
error: cannot dynamic_cast '((const Data<double, DefaultManager>*)this)->Data<double, DefaultManager>::data_' (of type 'double* const') to type 'class Container*' (source …
Run Code Online (Sandbox Code Playgroud) 我有一个脑死亡的时刻......我有两个表格描述:
CREATE TABLE table_a (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL
UNIQUE (name))
CREATE TABLE table_b (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
a_key INTEGER NOT NULL,
other_stuff VARCHAR(255) NOT NULL,
FOREIGN KEY(a_key) REFERENCES table_a(id)
ON DELETE CASCADE)
Run Code Online (Sandbox Code Playgroud)
如何从table_a中选择table_b.a_key中没有条目的所有行?
我有一个模板化的类(部分)定义为
template <class T> MyClass
{
public:
void DoSomething(){}
};
Run Code Online (Sandbox Code Playgroud)
如果我想从另一个类调用DoSomething,但是能够在同一个地方为多个'T'类型执行此操作,我会因为方法函数指针被唯一地约束到类类型而陷入困境.当然,每个MyClass都是不同的类型,所以我不能以'多态'的方式存储MyClassDoSomething()的函数指针.
我的用例是我想在一个包含类中存储一个"DoSomething"函数指针向量,这样我就可以从一个地方发出对所有存储类的调用.
有人有什么建议吗?
我有一个类,在头部定义为:
template <typename T> class MyClass
{
template <typename U> friend std::ostream& operator<<(std::ostream& output, const MyClass<U>& p);
public:
...
}
Run Code Online (Sandbox Code Playgroud)
在实现文件中,我有:
template <typename U> std::ostream& operator<<(std::ostream& output, const MyClass<U>& m)
{
output << "Some stuff";
return output;
}
Run Code Online (Sandbox Code Playgroud)
这一切看起来都相当犹豫.但是,当我尝试使用此运算符(即std :: cout << MyClass())时,我收到以下链接器错误:
Undefined symbols: std::basic_ostream<char, std::char_traits<char> >& operator<< <InnerType>(std::basic_ostream<char, std::char_traits<char> >&, MyClass<InnerType> const&)
Run Code Online (Sandbox Code Playgroud)
我很惊讶编译器没有为我自动生成这个...有什么建议我做错了什么?
一点思考实验......成分1:(预编译)共享库中的一个类,它具有一个指向从ostream派生的对象的指针的函数:
void ClassName::SetDefaultStream(std::ostream *stream)
Run Code Online (Sandbox Code Playgroud)
成分2:
我自己的类派生自std :: ostream,带有一些通用的模板化流操作符:
class MyStream : public std::ostream
{
public:
template <typename T> MyStream &operator<<(const T &data)
{
std::cout << data;
return *this;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我将此类的实例化地址传递给SetDefaultStream方法,会发生什么?在编译时,编译器不知道将在共享类中将哪些类型应用于流,因此肯定不会合成任何代码?它会无法编译,它会编译然后在运行时崩溃,会从计算机中冒出来吗?