gpt4 book ai didi

c++ - 为什么我们在使用宏时找不到合适的运算符重载?

转载 作者:行者123 更新时间:2023-11-30 02:22:18 25 4
gpt4 key购买 nike

我正在编写一个类模板,它将任意函数指针作为非类型模板参数。我想用

template <auto F> struct Foo;

但我的编译器 (MSVC 2017.5) 不支持 auto在模板参数列表中(即使它支持许多 C++17 功能)。所以我以某种方式围绕这个写了一个 hack:

template <typename T>
using Func = void (*)(T);

template <typename TF, TF F> struct Foo;
template <typename T, Func<T> F>
struct Foo<Func<T>, F> { ... };

#define FOO(func) Foo<decltype(func), func>

我实现了一个流式运算符(用于 QDebug 或任何其他文本流),如下所示:

template <typename T, Func<T> F>
QDebug &operator <<(QDebug &out, const FOO(F) &foo)
{
...
return out;
}

但是我的主代码找不到正确的operator<<过载:

void func(int) { ... }

...

FOO(&func) foo;
qDebug() << foo; // error

令人惊讶的是,在定义运算符时一切正常

QDebug &operator <<(QDebug &out, const Foo<Func<T>, F> &foo)
// ^^^^^^^^^^^^^^^

似乎Func<T>从最后一行和decltype<F>从宏不给相同的类型。但我检查了这个和std::is_same_v<Func<int>, decltype(&func)>给出真实的。我想不出为什么要使用宏 FOO给我任何其他编译时行为,就像不使用它时一样。


一个最小的工作示例:

#include <iostream>

template <typename T>
using Func = void (*)(T);

template <typename TF, TF F> struct Foo;
template <typename T, Func<T> F>
struct Foo<Func<T>, F> { };

#define FOO(func) Foo<decltype(func), func>

template <typename T, Func<T> F>
std::ostream &operator <<(std::ostream &out, const FOO(F) &foo)
// std::ostream &operator <<(std::ostream &out, const Foo<Func<T>,F> &foo)
{
return out;
}

void func(int);

int main(int argc, char **argv)
{
FOO(&func) foo;
std::cout << foo << std::endl; // error
}

最佳答案

解决方法:

template <typename T, Func<T> F> 
struct Foo<Func<T>, F> {
friend QDebug &operator <<(QDebug &out, const Foo &foo){
...
return out;
}
};

关于c++ - 为什么我们在使用宏时找不到合适的运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47378140/

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