小编use*_*167的帖子

基于编译时类型的调度

遵循“现代 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)

c++ templates

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

用于选择未引用行的SQL查询

我有一个脑死亡的时刻......我有两个表格描述:

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中没有条目的所有行?

mysql sql

4
推荐指数
2
解决办法
2341
查看次数

函数指针指向模板类成员函数

我有一个模板化的类(部分)定义为

template <class T> MyClass
{
public:
   void DoSomething(){}
};
Run Code Online (Sandbox Code Playgroud)

如果我想从另一个类调用DoSomething,但是能够在同一个地方为多个'T'类型执行此操作,我会因为方法函数指针被唯一地约束到类类型而陷入困境.当然,每个MyClass都是不同的类型,所以我不能以'多态'的方式存储MyClassDoSomething()的函数指针.

我的用例是我想在一个包含类中存储一个"DoSomething"函数指针向量,这样我就可以从一个地方发出对所有存储类的调用.

有人有什么建议吗?

c++ templates function member

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

编译器没有创建模板化的ostream <<运算符

我有一个类,在头部定义为:

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)

我很惊讶编译器没有为我自动生成这个...有什么建议我做错了什么?

c++ templates operator-overloading ostream operator-keyword

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

模板函数传递给共享库(c ++)

一点思考实验......成分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方法,会发生什么?在编译时,编译器不知道将在共享类中将哪些类型应用于流,因此肯定不会合成任何代码?它会无法编译,它会编译然后在运行时崩溃,会从计算机中冒出来吗?

c++ templates shared function

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