编辑:只是为了澄清“t”在铸造时被成功调用。编译器知道并确实声明它是一个带有int类型参数的函数指针。我提供一个null int指针来打破循环,因为它是递归调用自身。它可能只是编译器中的一个错误。
我试图从模板函数参数调用一个函数。 我认为可以在没有显式转换的情况下调用该函数,但似乎并非如此。使用VC2013。
template<typename T>
void func(T t)
{
printf("calling func...\n");
if (t)
{
((void(__cdecl*)(int))t)((int)nullptr); // explicit casting is successful
t ((int)nullptr); // compile error: ``term does not evaluate to a function taking 1 arguments``
}
}
void main()
{
auto pe = func < int > ;
auto pf = func < void(__cdecl*)(int) >;
pf(pe);
}
答案 0 :(得分:2)
func<int>
的错误变为:
void func(int t)
{
printf("calling func...\n");
if (t)
{
((void(__cdecl*)(int))t)((int)nullptr); // bad casting
t ((int)nullptr); // compile error: int is not a callable object
}
}
答案 1 :(得分:1)
当t
是int
时,您当然不能将其视为一种功能。您必须专门为int
设置模板或使用其他功能。另外,请忘记有C风格的演员阵容,他们只能射到脚下。
答案 2 :(得分:0)
我不明白你到底想要什么。但也许是这样的事情?:
#include <iostream>
#include <type_traits>
template<typename T>
void call_helper(T value, std::true_type) // value is function
{
std::cout << "Function" << std::endl;
value(0);
}
template<typename T>
void call_helper(T value, std::false_type) // value is NOT function
{
std::cout << "Not function" << std::endl;
std::cout << value << std::endl;
}
template<typename T>
void call(T value)
{
call_helper(value, std::is_function<typename std::remove_pointer<T>::type>());
}
int main()
{
void (*f)(int) = call<int>;
call(f);
}