我正在创建一个函数(可能是成员函数,而不是它很重要......也许它确实?)需要接受未知数量的参数,但我希望它们都是相同的类型.我知道我可以传入数组或向量,但我希望能够直接接受args列表而无需额外的结构甚至是额外的括号.看起来variadic函数本身并不是类型安全的,我不知道如何使用这个w/variadic模板函数.这基本上就是我的目标(更可能不是正确的代码,完全不是为了获取龙的列表,哈哈):
//typedef for dragon_list_t up here somewhere.
enum Maiden {
Eunice
, Beatrice
, Una_Brow
, Helga
, Aida
};
dragon_list_t make_dragon_list(Maiden...) {
//here be dragons
}
Run Code Online (Sandbox Code Playgroud)
要么
template<Maiden... Maidens> dragon_list_t make_dragon_list(Maidens...) {
//here be dragons
}
Run Code Online (Sandbox Code Playgroud)
用法
dragon_list_t dragons_to_slay
= make_dragon_list(Maiden.Eunice, Maiden.Helga, Maiden.Aida)
;
Run Code Online (Sandbox Code Playgroud)
尝试了类似于上面的一些事情,没有骰子.建议?我可能做出明显的疏忽?我知道这样做可能不是一件大事:
dragon_list_t make_dragon_list(std::array<Maiden> maidens) {
//here be dragons.
}
dragon_list_t dragons_to_slay
= make_dragon_list({Maiden.Eunice, Maiden.Helga, Maiden.Aida})
;
Run Code Online (Sandbox Code Playgroud)
但如果可能的话,我宁愿能够以第一种方式做到这一点.
我试图在ASP.NET Core 1.0(MVC 6)Web应用程序中设置授权.
更严格的方法 - 默认情况下,我希望将所有控制器和操作方法限制为具有Admin角色的用户.所以,我正在添加一个全局授权属性,如:
AuthorizationPolicy requireAdminRole = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.RequireRole("Admin")
.Build();
services.AddMvc(options => { options.Filters.Add(new AuthorizeFilter(requireAdminRole));});
Run Code Online (Sandbox Code Playgroud)
然后我想允许具有特定角色的用户访问具体的控制器.例如:
[Authorize(Roles="Admin,UserManager")]
public class UserControler : Controller{}
Run Code Online (Sandbox Code Playgroud)
这当然是行不通的,因为"全局过滤器"不允许UserManager访问控制器,因为它们不是"管理员".
在MVC5中,我能够通过创建自定义授权属性并将我的逻辑放在那里来实现这一点.然后使用此自定义属性作为全局.例如:
public class IsAdminOrAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
ActionDescriptor action = filterContext.ActionDescriptor;
if (action.IsDefined(typeof(AuthorizeAttribute), true) ||
action.ControllerDescriptor.IsDefined(typeof(AuthorizeAttribute), true))
{
return;
}
base.OnAuthorization(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
我试图创建一个自定义AuthorizeFilter,但没有成功.API似乎有所不同.
所以我的问题是:是否可以设置默认策略,然后为特定控制器和操作覆盖它.或类似的东西.我不想这样做
[Authorize(Roles="Admin,[OtherRoles]")]
Run Code Online (Sandbox Code Playgroud)
在每个控制器/操作上,因为这是一个潜在的安全问题.如果我不小心忘记了这个Admin角色会发生什么.
我只是想知道C++ 0x std lib中是否有任何东西可用于计算参数包中的参数数量?我想在下面的代码中删除field_count.我知道我可以构建自己的计数器,但看起来这似乎是一个显而易见的事情,包括在C++ 0x std lib中,我想确定它不存在:)本土计数器实现也非常欢迎.
template<const int field_count, typename... Args> struct Entity {
const tuple<Args...> data;
const array<const char*, field_count> source_names;
Entity() : data() {
}
};
Run Code Online (Sandbox Code Playgroud) 这是我的问题.我只是好奇在限制可以传递给泛型函数或类的类型方面的共识.我以为我曾经读过,如果你正在进行通用编程,通常最好先把东西打开而不是试图关闭它们(不记得来源).
我正在编写一个具有一些内部泛型函数的库,我觉得它们应该只允许库中的类型与它们一起使用,因为这就是我的意思.另一方面,我不确定我将锁定事情的努力值得.
任何人都可能有一些关于这个主题的统计数据或权威评论?我也对合理的意见感兴趣.希望这并不能完全解决这个问题:
此外,SO上是否有任何标签等同于"最佳实践"?我没有特别看到那个,但似乎能够提出给定SO主题的所有最佳实践信息是有帮助的......也许不是,只是一个想法.
编辑:到目前为止,一个答案提到我正在做的库的类型将是重要的.它是一个数据库库,最终使用STL容器,variadics(元组),Boost Fusion,这种性质的东西.我可以看到这是如何相关的,但我也会对确定走哪条路的经验法则感兴趣.
我一直在尝试为std :: cout编写一个线程安全的包装器,并认为这是学习一些可变参数模板的好时机.
然后,当我认为我做对了,我注意到它与std :: endl不兼容.
拿这个代码:
template <typename... P>
void f(P...){}
int main()
{
f(1,2,3,std::endl);
}
Run Code Online (Sandbox Code Playgroud)
当你尝试编译它时,GCC以一种非常愚蠢的方式抱怨:
main.cpp:18:19: error: too many arguments to function 'void f(P ...) [with P = {}]'
Run Code Online (Sandbox Code Playgroud)
当您使用常规模板尝试时,您会得到
main.cpp:22:13: error: no matching function for call to 'f(<unresolved overloaded function type>)'
Run Code Online (Sandbox Code Playgroud)
这实际上是有道理的.
这对我来说不是一个大问题,我可以用其他方式来做,但我真的想知道是否有办法绕过这个限制.
编辑:我正在使用tdm-gcc-4.7.1-2 for Windows
不知道如何解决这个问题.我想将它用作一种类型列表,让我知道我正在尝试使用Btypedef中不存在的类型.
template <typename T, typename U>
struct A {
typedef pair<T, U> type;
};
struct B : A<int, string>, A<int, float> {};
B::type foo; // won't compile, ambiguous reference, as expected
B::A<int, int>::type bar; // compiles fine?? :(
Run Code Online (Sandbox Code Playgroud)
有没有办法让它失败A<int, int>(以及任何其他A没有继承的B),或另一种方式来解决这个问题?我想我可以使用一个tuple并通过它来is_same递减,对每个元素进行比较与我提供的元函数进行比较,但这看起来更容易......起初:
我一直在关注这三个数据库库,我想知道他们是否做了什么来阻止SQL注入.我很可能会在其中一个上面构建一个lib,而注入是我在选择一个时最关注的问题.有人知道吗?
例如,类似于:
Dictionary<string, Func<T1, T2, bool>> comparisons;
comparisons.add("<", (x, y) => x < y);
comparisons.add("==", (x, y) => x == y);
comparisons.add(">", (x, y) => x > y);
Run Code Online (Sandbox Code Playgroud)
在这一点上,我对C#lambdas和多类型通用容器知之甚少,无法正确地将它们放在一起.这甚至可能吗?
我想确定任何可变参数类模板是否是另一个类的基础.通常我会使用std :: is_base_of,但我不认为我的用例适合,而且我不确定是否已经有std或boost中的东西来处理这个问题.我希望可变参数基类模板的参数包来自另一个可变参数类模板.这是一些示例代码,希望能够解释我想要做的事情:
用法:
is_variadic_base_of<
VarClassTemplA
, ClassDerivedFromA
, VarClassTemplB //Has param pack I want to use with ClassA
>::value;
Run Code Online (Sandbox Code Playgroud)
胆:
//test for variadic base of non-variadic
template <template<typename...> class A, typename B, typename... ArgsC>
struct is_variadic_base_of
: std::is_base_of<A<ArgsC...>, B>
{};
Run Code Online (Sandbox Code Playgroud)
这可能吗?
编辑:我认为我所问的最有可能的用例是创建一个从 接收右值引用元组的函数时std::forward_as_tuple()。
想到这个问题的原因是因为我正在检查传递给构造函数初始值设定项的对象的成员,看看它们是否是右值引用(我愿意接受建议,告诉我这是错误的错误错误......希望后面跟着一个根据经验,避免将来出现这种情况,但这就是引发问题的原因)。我想到,在稍微不同的上下文中,我可能最终会将具有右值引用成员的对象传递给我可能控制或可能不控制的多个函数(或函数对象),这些函数可能会从这些成员进行移动。
template<typename... Args>
void my_func(std::tuple<Args...>&& tup) {
//if tup's members are rvalue references,
//and this function moves guts from tup members, then...
func_i_dont_control(tup);
//what happens here if moves are done on the same members?
another_func_i_dont_control(std::move(tup));
}
Run Code Online (Sandbox Code Playgroud)
我看过使用右值引用成员?,以及右值引用成员的一些其他讨论,但我不太能够明确地解决这个问题。
我不只是问会发生什么,而是问这种情况是否应该/可能发生,以及在传递包含右值引用成员的对象时要记住哪些关键规则。
c++ ×8
c++11 ×7
templates ×5
c# ×2
.net ×1
asp.net-core ×1
boost ×1
collections ×1
database ×1
dictionary ×1
inheritance ×1
lambda ×1
lifetime ×1
otl ×1
parameters ×1
soci ×1
std ×1
temporary ×1
type-traits ×1
typedef ×1
variadic ×1