我们都知道,什么是模板。强烈地说,它是代码的一部分,只有在使用了它的副本并且所有参数都被设置时才会检查错误。
我们也知道,模板的参数必须是常量值表达式。所以我们不能使用变量作为模板的参数。
但我们可以看到,在编译模板时,负责它的代码就像使用粘贴在形式参数上的参数一样复制。
我们可以使用代码的一部分作为模板的参数吗?
例如我们有:
template<bool arg>
class foo
{
bool val;
public:
foo() : val(arg) {};
}
Everething正常,因为arg
是一个常数值,所以效果很好。
但是,我不想使用静态的代码部分,粘贴到模板上,如下所示:
class foo
{
int a,b,c;
public:
foo() : a(0),b(0),c(0)
{};
foo(int an, int bn, int cn) : a(an),b(bn),c(cn)
{};
template<partOfCode cond>
bool foo_check()
{
if(cond) return true;
else return false;
};
};
int main(char* args, char** argv)
{
foo foovar;
foovar.foo_check<this->a==0>();
//or
foovar.foo_check<a==3>();
};
当然,我遇到了这样的错误。但如果真的将参数代码的一部分粘贴到其位置的模板上,则至少不会出现任何语法错误。
有人可以回答,我可以使用define指令。但这无济于事,因为模板和预处理器是独立的。
有没有办法实现这样的东西?
答案 0 :(得分:2)
模板不会像宏那样复制文本,所以你是:
this
你必须传递一个功能:
template <typename FunctionToCall>
bool foo_check(FunctionToCall func)
{
return func(); // simplified
};
// this is how you call it with lambda function
foovar.foo_check([&]{ return foovar.get_a() == 0; }); // still have to provide an accessor, or make a friend function instead
模板的地狱,如果你只需要一个条件的功能,你可以做
bool foo_check(std::function<bool()> const& func)
{
return func(); // at this point, isn't foo_check useless?
}