使用类构造函数作为可调用对象

时间:2017-06-12 05:32:12

标签: c++ c++11

class C {
public:
    C() {}
};

template<typename T>
void func(T f) {}

int main() {
    func(C);
}

如何修复编译错误“2.cpp:9:15:错误:在'之前预期的primary-expression')'令牌          FUNC(C);?“

传递类作为参数似乎很荒谬,但我想编译类似线程的函数,因为“thread(C)”工作正常:

#include <thread>

class C {
public:
    C() {}
};

template<typename T>
void func(T f) {}

int main() {
    std::thread(C);
}

2 个答案:

答案 0 :(得分:9)

不幸的是,C ++中的one cannot take address of a constructor。意思是,你不能简单地把#34;一个指向构造函数的指针&#34;并将其用作函子(就像你使用自由函数或成员函数一样)。

你实际上不能通过课程&#34;作为一个参数,因为C ++核心没有反射,如果你得到一个类&#34;在运行时,你不能用它做任何事情。你只能通过一个班级&#34;作为模板参数。

但是,你可以做的只是使用lambda函数,它将调用相应的构造函数:

class C {
public:
    C() {}
};

template<typename T>
void func(T f) {
  auto c_instance = f();
}

int main() {
    func([](){ return C(); });
}

请注意,您仍然没有在运行时传递任何内容 - lambda [](){ return C(); }的返回类型在编译时是已知的,因此auto c_instance的类型在编译时也是已知的。

但是,我认为如果您不需要将C的任何其他工厂传递到func,只需在func内创建实例就会更清楚:

class C {
public:
    C() {}
};

template<typename T>
void func() {
  T c_instance;
}

int main() {
    func<C>();
}

关于std::thread(c);

std::thread(C);

不是函数调用。 std::thread是一种类型。因此,它声明了一个名为C的局部变量。使用

auto a = std::thread(C);

应该产生类似的编译错误。

答案 1 :(得分:-2)

为了调用构造函数,它必须是公共的,所以:

class C {
    public:
        C() {}
};

template<typename T>
void func(T f) {}

int main() {
    C* instanceC = new C();
    func(instanceC);
    delete instanceC;
}

C是类型,函数中的参数f需要T的实例。