this question的答案使用类模板选择一个函数类型:
template <typename T>
struct function_args {};
template <typename R, typename... Args>
struct function_args<R(Args...)> {
using type = tuple<Args...>;
};
template <typename T>
using decltypeargs = typename function_args<T>::type;
当我研究在这里所做的事情时,我试图重写function_args
。我尝试使用函数执行此操作,以消除对decltypeargs
模板的需要。但发现自己陷入了不正确的语法:
<击> 撞击>
<击>template <typename T>
tuple<> myTry();
template <typename Ret, typename... Args>
tuple<Args...> myTry<Ret(Args...)>();
击> <击> 撞击>
我希望致电decltype(myTry<decltype(foo)>())
来获取tuple
类型,而不必致电decltypeargs<decltype(foo)>
。有没有办法用函数声明来做到这一点?
答案 0 :(得分:3)
使用函数,您可以只重复使用之前的相同类型特征:
template <typename T>
function_args<T> myTry();
或者您可以通过功能重新实现相同的功能。您无法部分专门化功能模板,但您可以重载:
namespace detail {
template <class T> struct tag { };
template <class R, class... Args>
tag<std::tuple<R, Args...>> myTry(tag<R(Args...)> );
template <class R, class C, class... Args>
tag<std::tuple<R, Args...>> myTry(tag<R(C::*)(Args...)> );
// etc.
}
template <typename T>
auto myTry() { return detail::myTry(detail::tag<T>{}); }
答案 1 :(得分:2)
(function($) {
$(document).ready(function() {
$(".avatarMessage .postlink").each(function(index, element) {
var $el = $(element);
//If already embedded just return
if ($el.data('oembedded')) return;
//set the flag
$el.data('oembedded', true);
$el.oembed(null, {
embedMethod: "append",
startClosed: true,
maxWidth: 300,
});
});
});
});
答案 2 :(得分:1)
函数不能像这样专门化,但您不需要为此专门化函数。用gcc 6.1.1测试:
#include <iostream>
#include <tuple>
template <typename T> struct my_try;
template <typename Ret, typename... Args>
struct my_try<Ret(Args...)> {
std::tuple<Args...> operator()();
};
template<typename T>
auto MyTry()
{
return my_try<T>()();
}
void foo(int, char);
int main()
{
decltype(MyTry<decltype(foo)>()) t;
int *a= &std::get<0>(t);
char *b= &std::get<1>(t);
return 0;
}