将匿名临时函数对象传递给模板化构造函数的问题

Aka*_*ksh 3 c++ templates anonymous functor

我试图附加一个函数对象来被破坏一个模板化的类.但是,我似乎无法将函数对象作为临时对象传递.我得到的警告是(如果评论该行xi.data = 5;):

    warning C4930: 'X<T> xi2(writer (__cdecl *)(void))': 
    prototyped function not called (was a variable definition intended?)
            with
            [
                T=int
            ]
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用构造的对象,我得到一个编译错误说:

error C2228: left of '.data' must have class/struct/union
Run Code Online (Sandbox Code Playgroud)

我为冗长的代码道歉,但我认为所有组件都需要可见才能评估情况.

template<typename T>
struct Base
{
    virtual void run( T& ){}
    virtual ~Base(){}
};

template<typename T, typename D>
struct Derived : public Base<T>
{
    virtual void run( T& t )
    {
        D d;
        d(t);
    }
};

template<typename T>
struct X
{
    template<typename R>
    X(const R& r)
    {
       std::cout << "X(R)" << std::endl;
       ptr = new Derived<T,R>(); 
    }

    X():ptr(0)
    { 
        std::cout << "X()" << std::endl; 
    }

    ~X()
    {
        if(ptr) 
        {
            ptr->run(data);
            delete ptr;
        }
        else
        {
            std::cout << "no ptr" << std::endl;
        }
    }

    Base<T>* ptr; 
    T data;
};

struct writer
{
    template<typename T>
    void operator()( const T& i )
    { 
        std::cout << "T : " << i << std::endl;
    }
};

int main()
{
    {
        writer w;
        X<int> xi2(w);
        //X<int> xi2(writer()); //This does not work!
        xi2.data = 15;       
    }

    return 0;
};
Run Code Online (Sandbox Code Playgroud)

我尝试这个的原因是我可以"以某种方式"将函数对象类型与对象相连,而无需在类中保留函数对象本身的实例.因此,当我创建一个对象时class X,我不必保留其中的对象class writer,而只需要一个指针Base<T>(我不确定我是否需要<T>这里,但现在它在那里).

问题是我似乎必须创建一个对象,writer然后将其传递给构造函数X而不是像它一样调用它X<int> xi(writer();

我可能会遗漏一些完全愚蠢而明显的东西,有什么建议吗?

Tyl*_*nry 7

看起来像是一个"最令人烦恼的解析"问题.尝试

X<int> xi2 = X<int>(writer());
Run Code Online (Sandbox Code Playgroud)

要么

X<int> xi2((writer()));
Run Code Online (Sandbox Code Playgroud)


Cha*_*tie 5

尝试额外的一对括号X<int> xi2((writer()));这将阻止编译器思考您的预定义函数.(Scott Meyers有效的STL项目6.)


Ste*_*sop 5

X<int> xi2(writer());是一个名为xi2的函数的声明,它本身返回X<int>一个函数,并将一个不带参数并返回一个writer的函数作为参数.这是一个"最令人烦恼的解析".

解决方案是执行您已完成的操作,避免临时或添加更多括号.