在我的基本c ++书中,没有类似下面的类声明。 我的奇怪代码是......
boost::signals2::signal<bool (const std::string& message,
const std::string& caption, unsigned int style),
boost::signals2::last_value<bool> > ThreadSafeMessageBox;
圆括号中的内容(const std:::string
...)不是typename而是实例。怎么可能呢?上面的代码编译得很好。
P.S。模板类(signal
)代码是
template<typename Signature,
typename Combiner = optional_last_value<typename boost::function_traits<Signature>::result_type>,
typename Group = int,
typename GroupCompare = std::less<Group>,
typename SlotFunction = function<Signature>,
typename ExtendedSlotFunction = typename detail::extended_signature<function_traits<Signature>::arity, Signature>::function_type,
typename Mutex = mutex >
class signal: public detail::signalN<function_traits<Signature>::arity,
Signature, Combiner, Group, GroupCompare, SlotFunction, ExtendedSlotFunction, Mutex>::type
{ /*...*};
答案 0 :(得分:3)
查看Boost.Signals2的文档:
Boost.Signals2库是托管信号和插槽系统的实现。 信号表示具有多个目标的回调
所以我们知道&#34;信号&#34;与#34;回调&#34;有关。 callback是稍后调用的函数。
那么,请查看文档中的"Hello World"示例:
struct HelloWorld
{
void operator()() const
{
std::cout << "Hello, World!" << std::endl;
}
};
// ...
// Signal with no arguments and a void return value
boost::signals2::signal<void ()> sig;
// Connect a HelloWorld slot
HelloWorld hello;
sig.connect(hello);
// Call all of the slots
sig();
首先,我们创建一个信号
sig
,一个不带参数且返回值为void
的信号。接下来,我们使用hello
方法将connect
函数对象连接到信号。最后,像函数一样使用信号sig
来调用插槽,然后调用HelloWorld::operator()
来打印&#34; Hello,World!&#34;。
阅读完所有内容后,我们可以推断出什么?我们可以推断出信号的模板参数是函数类型。它表示可以连接到信号的功能类型。
所以,在你的例子中
boost::signals2::signal<bool (const std::string& message,
const std::string& caption,
unsigned int style),
boost::signals2::last_value<bool>
> ThreadSafeMessageBox;
ThreadSafeMessageBox
是一个可以连接到以下函数的信号:
bool
const std::string&
const std::string&
unsigned int
(对于这个问题,我们可以忽略的第二个模板参数,它不是必需的模板参数,也不是回调函数签名的一部分,而是称为Combiner)
答案 1 :(得分:0)
期望为模板参数Signature
的类型是函数签名,即预期函数参数的数量,类型和返回类型的规范。
在你的情况下
boost::signals2::signal<bool (const std::string& message, const std::string& caption, unsigned int style), boost::signals2::last_value<bool> > ThreadSafeMessageBox;
模板boost::signals2::signal
的第一个参数是函数签名:
bool (const std::string& message, const std::string& caption, unsigned int style)
这是一个包含3个参数的函数(类型为string
,string
和unsigned int
)并返回bool
。