是否可以将"using"声明与模板基类一起使用?我已经读过它不在这里,但是由于技术原因还是它违反C++标准,它是否适用于gcc或其他编译器?如果不可能,为什么不呢?
示例代码(来自上面的链接):
struct A {
template<class T> void f(T);
};
struct B : A {
using A::f<int>;
};
Run Code Online (Sandbox Code Playgroud) 我用这个命令:
sed -i "10 i \t\t\ttime.sleep(0.1) " /home/test_file
Run Code Online (Sandbox Code Playgroud)
在第10行插入一行如下: <TAB><TAB><TAB>sleep(0.1)
但是我得到了
t<TAB><TAB>sleep(0.1)...
Run Code Online (Sandbox Code Playgroud)
你能告诉我怎么得到这个结果吗?谢谢
PS.我在可执行的bash脚本中使用此命令.
我有一个类,我想在我的头文件中引用它,它位于一长串嵌套命名空间中:MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass.我想以不同的名称使用它,但不是MyVeryLongNamedClass- 更短更有用的东西,比如MyClass.
我可以放入using MySpaceA::MySpaceB::MySpaceC::MySpaceD我的标题,但我不想导入整个命名空间.我宁愿有某种结构
using MyClass = MySpaceA::MySpaceB::MySpaceC::MySpaceD::MyVeryLongNamedClass
我知道这可以使用名称空间,但我似乎无法使用它来使用类.
非常感谢您的帮助.
这是我的静态类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Linq.Expressions;
using System.Text;
using System.Web;
namespace Foo.WebUI.Infrastructure
{
public static class HtmlHelpers
{
public static MvcHtmlString Image(this HtmlHelper helper, string src, string altText)
{
var builder = new TagBuilder("img");
builder.MergeAttribute("src", src);
builder.MergeAttribute("alt", altText);
return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));
}
public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var names = Enum.GetNames(metaData.ModelType);
var sb = new StringBuilder();
foreach (var name in names)
{
var id = …Run Code Online (Sandbox Code Playgroud) 我在初始化列表中有很多命名空间用法,并且希望使用using命名空间来减少详细程度.但是,初始化列表超出了构造函数括号的范围,因此我必须将使用放在构造函数外部并使用它污染文件的其余部分.有没有办法根据需要调整使用范围?而不是:
MyClass::MyClass() :
m_one(nsConstants::ONE),
m_two(nsConstants::TWO),
m_three(nsConstants::THREE)
{}
Run Code Online (Sandbox Code Playgroud)
我想要:
MyClass::MyClass() :
using namespace nsConstants;
m_one(ONE),
m_two(TWO),
m_three(THREE)
{}
Run Code Online (Sandbox Code Playgroud)
_
在VB.NET中,我可以通过导入System.Math并直接引用其方法来使我的数学代码更加清晰:
Imports System.Math
[...]
Return New Vector3(Sin(az) * Cos(el), Cos(az) * Cos(el), Sin(el))
Run Code Online (Sandbox Code Playgroud)
但我不认为C#可以使用类来隐式访问它们的方法,所以我必须做类似的事情:
using System;
[...]
return new Vector3(Math.Sin(az) * Math.Cos(el), Math.Cos(az) * Math.Cos(el), Math.Sin(el));
Run Code Online (Sandbox Code Playgroud)
但那很难看; 它需要自己的滚动条!有没有办法用C#写一些看起来像我的VB.NET代码的东西?我可以为Sin和Cos编写局部包装器方法,但不会降低性能(因为函数调用的开销)?而且,这需要为我正在使用的每个类中使用的每个Math函数编写包装函数; 这也不是那么令人满意.
出于方便和安全的原因,我想使用该using语句来分配和释放来自/到池的对象
public class Resource : IDisposable
{
public void Dispose()
{
ResourcePool.ReleaseResource(this);
}
}
public class ResourcePool
{
static Stack<Resource> pool = new Stack<Resource>();
public static Resource GetResource()
{
return pool.Pop();
}
public static void ReleaseResource(Resource r)
{
pool.Push(r);
}
}
Run Code Online (Sandbox Code Playgroud)
和访问池一样
using (Resource r = ResourcePool.GetResource())
{
r.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
我找到了一些关于滥用using和Dispose()范围处理的主题,但所有这些主题都包含在内using (Blah b = _NEW_ Blah()).
在离开使用范围但保留在池中之后,不会释放对象.
如果using语句只是简单地扩展到一个简单,try finally Dispose()这应该工作正常但是在幕后会发生更多的事情,或者在未来的.Net版本中这种情况不会发生吗?
using在这种情况下,我需要通过(或任何其他方法)使用类型别名:
template <class T>
typename std::enable_if< /*HERE*/>::value
f (...) {};
Run Code Online (Sandbox Code Playgroud)
我写的HERE地方很长,结构内部定义了多种类型,而不是写,typename <very long templated struct dependent on T>::type我想写一个快捷方式.
我在更多情况下遇到过这种情况,比如模板特化和后缀返回类型语法.那么using在第一行template <...>和结构/类或函数之间的位置是否有任何使用方式(没有双关语)?
我尝试使用,(逗号)之类的东西,(using X = ... , /*actually using X*/)但没有成功.
有效的是全球范围内的 using
template <class Iterator>
using DT = typename DereferenceType<Iterator>::type&;
Run Code Online (Sandbox Code Playgroud)
但我不想要全局范围,我希望范围只适用于我使用它的模板.我不想写DT<Iterator>,只是DT.
不用说宏或任何预处理器指令都是不可能的.
真人生活的例子:
template <class Iterator, class GetCompValue, class SortOrder = Ascending>
typename std::enable_if<
IsDereferenceable<Iterator>::value &&
IsCallableLike<GetCompValue,
typename DereferenceType<Iterator>::type&(
typename DereferenceType<Iterator>::type&)>::value &&
IsSortOrder<SortOrder>::value, void>::type
RadixSortLSDByteOffsetIter(Iterator …Run Code Online (Sandbox Code Playgroud) 我有一些看起来像这样的代码:
namespace myLibrary
{
class A
{
public:
struct Nested
{
...
};
...
};
}
Run Code Online (Sandbox Code Playgroud)
在代码的其他部分,我需要访问A.因为我喜欢可读的代码,我也喜欢using指令:
using myLibrary::A;
...
A a;
Run Code Online (Sandbox Code Playgroud)
现在,在某些时候我还需要访问我的嵌套类,所以我想写这样的东西:
using myLibrary::A::Nested;
Run Code Online (Sandbox Code Playgroud)
显然,编译器不能知道这是一个嵌套类而不是类成员,并给我一个错误:
error : using declaration can not refer to class member
Run Code Online (Sandbox Code Playgroud)
我无法理解的是为什么这不能解决问题:
using typename myLibrary::A::Nested;
Run Code Online (Sandbox Code Playgroud)
编译器仍然给我完全相同的错误!
幸运的是,我有其他选择:
// Using a typedef
typedef myLibrary::A::Nested Nested;
// Using the new C++11 syntax for type aliasing
using Nested = myLibrary::A::Nested;
Run Code Online (Sandbox Code Playgroud)
但我想了解为什么使用typename指令不起作用.它不符合我的想法吗?或者它不是由编译器实现的?如果是后者,是否有理由呢?
我正在阅读Bjarne Stroustrup的"The C++ Programming Language"第4版.在本书的第一部分中,我发现了using如下所示的用法:
// Error is in these 2 lines
template<typename T>
using Iterator<T> = typename T::iterator;
Run Code Online (Sandbox Code Playgroud)
*有关完整程序和错误消息,请参阅[**]*
这正是我在页面105中找到的.当我把它变成一个完整的程序并试图编译它时,g++给了我这个错误masseage:
> g++ -std=c++14 -o fnd find_all.cpp
find_all.cpp:13:15: error: expected '=' before '<' token
using Iterator<T> = typename T::iterator;
^
find_all.cpp:13:15: error: expected type-specifier before '<' token
Run Code Online (Sandbox Code Playgroud)
我在这段代码中找不到任何问题,(我是C++的新手,我用我的小知识找不到问题)(更混乱的是我在Bjarne的书上发现了这个)
有人能告诉我为什么那段代码会出错?
注:不过如果我换成
Iterator<C>用typename C::iterator(见下文),它工作正常,没有错误!
[**]完整程序和错误消息:
// Error is in these 2 lines
template<typename T>
using Iterator<T> = typename T::iterator;
// -------------------------------------------
// For …Run Code Online (Sandbox Code Playgroud)