【发布时间】:2020-01-07 12:13:01
【问题描述】:
受到This 示例的启发,即受到这段特定代码的启发
// ...
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
// ...
std::visit(overloaded {
[](auto arg) { std::cout << arg << ' '; },
[](double arg) { std::cout << std::fixed << arg << ' '; },
[](const std::string& arg) { std::cout << std::quoted(arg) << ' '; },
}, v);
...我试图定义一个overloaded 类型的类成员,但偶然发现了一些困难,我认为(但不完全确定)这是由于编译器无法推断出模板的参数造成的。
template<class ...Ts>
struct overloaded : Ts... {
using Ts::operator()...;
constexpr overloaded(Ts... ts) : Ts(ts)... {}
};
struct as{};
class phil_t {
int i;
overloaded o { [&](as&) {cout << i << "as"; } }; // <-- HERE
};
这是我收到的输出:
../../variant.hpp:21:5: error: invalid use of template-name ‘overloaded’ without an argument list
overloaded o { [&](as&) {cout << i << "as"; } };
^~~~~~~~~~
很明显,当我使用相同的方法来实例化不在类中的对象时,一切都运行得很顺利。
void varnt() {
int i = 42;
auto o = overloaded( [&](as&) {cout << i << "as"; } );
}
我们将不胜感激任何建议、解释或一些解决方法的提示。
谢谢。
【问题讨论】:
-
@Evg 不完全是。它帮助我理解“为什么”,而不是“如何”。不过还是谢谢你:)
-
似乎没有简单的方法可以打破循环依赖。一种可能的解决方案是use type-erasure。是否实用,我不确定。
标签: c++ templates type-deduction