所以this answer演示了如何在返回类型中使用函数强制Substitution Failure is not an Error (SFINAE)。
有没有办法让我可以使用和从函数中获得不同的返回类型?
因此,overload {
[&](auto& value) -> decltype(void(value.bar())) { value.bar(); } ,
[](fallback_t) { cout << "fallback\n"; }
}
的参数将触发SFINAE:
overload {
[&](auto& value) -> decltype(void(value.bar()), float) { value.bar(); return 1.0F; } ,
[](fallback_t) { cout << "fallback\n"; return 13.0F; }
}
但是我要说我需要一个不同的返回类型,我怎么能触发SFINAE?例如,我想做这样的事情:
struct one {
void foo(const int);
void bar();
};
struct two {
void foo(const int);
};
struct three {
void foo(const int);
void bar();
};
template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
template<class... Ts> overload(Ts...) -> overload<Ts...>;
struct fallback_t { template<class T> fallback_t(T&&) {} };
struct owner {
map<int, one> ones;
map<int, two> twos;
map<int, three> threes;
template <typename T, typename Func>
void callFunc(T& param, const Func& func) {
func(param);
}
template <typename T>
void findObject(int key, const T& func) {
if(ones.count(key) != 0U) {
callFunc(ones[key], func);
} else if(twos.count(key) != 0U) {
callFunc(twos[key], func);
} else {
callFunc(threes[key], func);
}
}
void foo(const int key, const int param) { findObject(key, [&](auto& value) { value.foo(param); } ); }
void bar(const int key) {
findObject(key, overload {
[&](auto& value) -> decltype(void(value.bar())) { value.bar(); } ,
[](fallback_t) { cout << "fallback\n"; }
} );
}
};
int main() {
owner myOwner;
myOwner.ones.insert(make_pair(0, one()));
myOwner.twos.insert(make_pair(1, two()));
myOwner.threes.insert(make_pair(2, three()));
myOwner.foo(2, 1);
cout << myOwner.bar(1) << endl;
cout << myOwner.bar(2) << endl;
cout << myOwner.foo(0, 10) << endl;
}
击> <击> 撞击>
此是最小,完整,可验证的示例。这是很多阅读,但如果你不想去看看链接,这是我尝试添加返回类型之前涉及的代码:
create table #TempToBeFilledInAnotherSp(
col1 int,
col2 int
);
exec spe2 param1, param2;--this sp will insert data in #TempToBeFilledInAnotherSp
--Now that I have all the data in temp table which I created here I can use it
select * from #TempToBeFilledInAnotherSp;--or do my further processing on the data
答案 0 :(得分:1)
你想要你的
吗?[&](auto& value) -> decltype(void(value.bar())) { value.bar(); } ,
返回浮动而不是空白?那么为什么不将float添加到decltype?
[&](auto& value) -> decltype(void(value.bar()), 1.0f) { value.bar(); return 1.0; }