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

标签 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
            ]

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

error C2228: left of '.data' must have class/struct/union

对于冗长的代码,我深表歉意,但我认为所有组件都需要可见才能评估情况。

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

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

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

我可能在这里遗漏了一些完全愚蠢和明显的东西,有什么建议吗?

最佳答案

看起来像是一个“最令人烦恼的解析”问题。尝试

X<int> xi2 = X<int>(writer());

X<int> xi2((writer()));

关于c++ - 将匿名临时函数对象传递给模板化构造函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2585021/

相关文章:

c++ - unordered_multimap - 迭代 find() 的结果会产生具有不同值的元素

c++ - 定义模板结构的特征时出现不完整的类型错误

c++ - 模板:获取类型并映射到函数

go - 如何用指针类型的匿名成员初始化 Go 结构?

wcf - 要求使用 WCF 的 SSL 会导致 "The HTTP request was forbidden with client authentication scheme ' 匿名“错误?

c++ - 在 C++ 中创建多维数组棋盘的问题

c++ - C/C++如何计算数值数据集的条纹度?

c++ - 不完整类型/前向声明的无效使用

c++ - 我们可以只为某些数据类型定义模板函数吗?

html - 如何在不影响其他div的情况下隐藏/显示匿名div