gpt4 book ai didi

c++ - 为什么我不能将模板函数指针传递给可变参数函数?

转载 作者:太空狗 更新时间:2023-10-29 23:17:08 24 4
gpt4 key购买 nike

以下 C++ 代码无法在 Visual Studio 2013 中为我编译:

#include <stdarg.h>
#include <stdio.h>
#include <wchar.h>

template <int X>
int Function()
{
return X;
}

int Sum(int start, ...)
{
va_list args;
va_start(args, start);

for (;;)
{
typedef int (*Callback)(); // typedef required by C standard 7.15.1.1
Callback func = va_arg(args, Callback);
if (!func)
break;
start += (*func)();
}

va_end(args);

return start;
}

int wmain()
{
wprintf(L"sum: %d\n", Sum(5, Function<32>, Function<66>, static_cast<int (*)()>(nullptr)));
return 0;
}

但是,我收到以下错误:

mycode.cpp(32) : error C2664: 'int Sum(int,...)' : cannot convert argument 2 from 'int (__cdecl *)(void)' to '...' Context does not allow for disambiguation of overloaded function

我知道这个错误通常意味着什么;它说您的函数已重载,因此您不能使用函数指针,除非您将其转换为可解析重载的类型。但在这种情况下,没有歧义:类型始终是 int (*)()!

最佳答案

问题是 Visual Studio 在尝试将模板函数传递给“...”之前没有正确或完全实例化模板函数。

这是一个解决方案,它为客户端代码提供(几乎)相同的语法,并在 visual studio 2010 上编译和工作。诀窍是将模板噱头隐藏在更标准的接口(interface)继承中。代码有点复杂,但仍然易于管理且安全。不过,不确定这是否适用于您的“现实生活”问题,您可能简化为在此处发布您的问题。

class IFunctor  {
public:
virtual ~IFunctor() {}
virtual int value() = 0;
};

template<int X> class Functor : public IFunctor {
public:
virtual ~Functor() {}
virtual int value() { return X; }
};

template<int X> IFunctor* Function()
{
static Functor<X> x;
return &x;
}

IFunctor *EndFunction()
{
return nullptr;
}

int Sum(int start, ...)
{
va_list args;
va_start(args, start);

for (;;)
{
IFunctor *functor = va_arg(args, IFunctor*);
if (functor == nullptr) break;
start += functor->value();
}

va_end(args);

return start;
}

int main()
{
wprintf(L"sum: %d\n", Sum(5, Function<32>(), Function<66>(), EndFunction()));
char c = getc(stdin);
return 0;
}

关于c++ - 为什么我不能将模板函数指针传递给可变参数函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20109821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com