代码的一部分作为模板参数

时间:2015-08-22 09:19:29

标签: c++ templates

我们都知道,什么是模板。强烈地说,它是代码的一部分,只有在使用了它的副本并且所有参数都被设置时才会检查错误。

我们也知道,模板的参数必须是常量值表达式。所以我们不能使用变量作为模板的参数。

但我们可以看到,在编译模板时,负责它的代码就像使用粘贴在形式参数上的参数一样复制。

我们可以使用代码的一部分作为模板的参数吗?

例如我们有:

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指令。但这无济于事,因为模板和预处理器是独立的。

有没有办法实现这样的东西?

1 个答案:

答案 0 :(得分:2)

模板不会像宏那样复制文本,所以你是:

  1. 尝试在非成员函数中引用this
  2. 尝试访问无法访问的变量
  3. 尝试使用运行时值而不是编译时常量实例化模板
  4. 你必须传递一个功能:

    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?
    }