注意:这似乎是一个问题的转贴:C++ - 重载模板化的类方法,并对该方法进行了部分说明
我已经将C++模板专业化的问题归结为一个简单的案例.
它由一个简单的2参数模板类组成Thing,我想专门Thing<A,B>::doSomething()研究它B=int.
#include <cstdio>
//
// A 3-parameter template class.
//
template <class A, class B>
class Thing
{
public:
Thing(A a, B b) : a_(a), b_(b) {}
B doSomething();
private:
A a_;
B b_;
};
//
// The generic case works as expected.
//
template <class A, class B>
B Thing<A,B>::doSomething()
{
return b_;
}
//
// This specialization does not work!
//
template <class A>
int Thing<A,int>::doSomething() …Run Code Online (Sandbox Code Playgroud) 我正在努力理解为什么这段代码片段无法编译.
#include <cstdio>
class A {
public:
virtual int potential()=0;
virtual int potential(int arg, int arg2)=0;
};
class B : public A {
public:
int potential() { return 1; }
virtual int potential(int arg, int arg2) { return 2; }
};
class C : public B {
public:
int potential(int arg, int arg2) { return 3; }
};
int main(int argc, char** argv) {
C c;
int value = c.potential();
printf("Got %i\n", value);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我有两个纯虚方法,都potential在抽象超类中命名A …
从Swift调用C非常简单,但我正在研究在C中制作双向包装器,所以我的C必须调用Swift函数.
现在,我可以通过在C中声明函数指针来实现这一点,并且在Swift端将它们设置为在Swift中调用代码之后让我的C函数调用它们.
我的C头文件:
typedef void (*callback_t)(void);
void callBackIntoSwift( callback_t cb );
Run Code Online (Sandbox Code Playgroud)
我的C实现文件:
#include "stuff.h"
#include <stdio.h>
void callBackIntoSwift( callback_t cb )
{
printf( "Will call back into Swift\n" );
cb();
printf( "Did call back into Swift\n" );
}
Run Code Online (Sandbox Code Playgroud)
在桥接头中包含我的C头文件后,我可以在Swift端执行以下操作:
let cb: callback_t = {
someKindOfSwiftFunction()
}
callBackIntoSwift( cb )
Run Code Online (Sandbox Code Playgroud)
甚至:
callBackIntoSwift {
someKindOfSwiftFunction()
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点,不需要函数指针和回调?我想让C端someKindOfSwiftFunction直接调用...但是当我尝试应用于@convention (c)函数声明时,我得到的消息是该属性只能应用于类型,而不是声明.
例如Github中的任何想法或代码库我都可以看看?
我希望从视频文件中的音轨中提取样本精确的LPCM音频范围.目前,我正在寻找实现这一目标用AVAssetReaderTrackOutput对一个AVAssetTrack从读取交付AVURLAsset.
尽管准备并确保使用AVURLAssetPreferPreciseDurationAndTimingKeyset to 初始化资产,但在资产中YES寻找样本准确的位置似乎是不准确的.
NSDictionary *options = @{ AVURLAssetPreferPreciseDurationAndTimingKey : @(YES) };
_asset = [[AVURLAsset alloc] initWithURL:fileURL options:options];
Run Code Online (Sandbox Code Playgroud)
这表现为例如可变比特率编码的AAC流.虽然我知道VBR音频流在准确搜索时会产生性能开销,但我愿意为此付费,前提是我提供了准确的样本.
当使用例如扩展音频文件服务和ExtAudioFileRefAPI时,我可以实现样本精确的搜索和音频提取.同样地AVAudioFile,因为它建立在之上ExtAudioFileRef.
然而,问题是我还想从媒体容器中提取音频文件只有API拒绝但在AVFoundation 中支持的音频AVURLAsset.
提取的样本准确时间范围使用CMTime和定义CMTimeRange,并设置在AVAssetReaderTrackOutput.然后迭代地提取样本.
-(NSData *)readFromFrame:(SInt64)startFrame
requestedFrameCount:(UInt32)frameCount
{
NSUInteger expectedByteCount = frameCount * _bytesPerFrame;
NSMutableData *data = [NSMutableData dataWithCapacity:expectedByteCount];
//
// Configure Output
//
NSDictionary *settings = @{ AVFormatIDKey : @( kAudioFormatLinearPCM ),
AVLinearPCMIsNonInterleaved …Run Code Online (Sandbox Code Playgroud) 我有一个对象,初始化时使用和释放调用创建一个串行 GCD队列.在对象的生命周期内,将调度块添加到队列中,但队列也会停止并使用和启动.dispatch_queue_createdispatch_freedispatch_suspenddispatch_resume
我的问题是,在某一点上,对象可能会被释放,并且在解除分配时,为了整洁,我希望完全丢弃调度队列及其中的所有dispatch_block_t对象,无论队列是否暂停.
据我了解,队列将不再解除分配,直到不再需要它,因为它不再由其中的调度块保留.这让我相信要解除分配队列,我必须通过允许其中的块首先执行终止来清空它.
什么是最简单,最强大的方法?
我正在考虑重新混合一些保存音频和视频的容器,以便提取最好的第一个音频流,并将其存储在一个新容器中,例如仅存在音频流。
\n\nFFmpeg 的输出上下文是这样创建的:
\n\nAVFormatContext* output_context = NULL;\navformat_alloc_output_context2( &output_context, NULL, "mp4", NULL );\nRun Code Online (Sandbox Code Playgroud)\n\n我有一个可接受的输出的候选列表,例如 MP4、M4A 等 \xe2\x80\xa6 基本上是 Apple 的音频文件服务可读的输出:
\n\nkAudioFileAIFFType = \'AIFF\',\nkAudioFileAIFCType = \'AIFC\',\nkAudioFileWAVEType = \'WAVE\',\nkAudioFileSoundDesigner2Type = \'Sd2f\',\nkAudioFileNextType = \'NeXT\',\nkAudioFileMP3Type = \'MPG3\', // mpeg layer 3\nkAudioFileMP2Type = \'MPG2\', // mpeg layer 2\nkAudioFileMP1Type = \'MPG1\', // mpeg layer 1\nkAudioFileAC3Type = \'ac-3\',\nkAudioFileAAC_ADTSType = \'adts\',\nkAudioFileMPEG4Type = \'mp4f\',\nkAudioFileM4AType = \'m4af\',\nkAudioFileM4BType = \'m4bf\',\nkAudioFileCAFType = \'caff\',\nkAudioFile3GPType = \'3gpp\',\nkAudioFile3GP2Type = \'3gp2\',\nkAudioFileAMRType = \'amrf\'\nRun Code Online (Sandbox Code Playgroud)\n\n我的问题是:FFmpeg 中是否有一个简单的 API,可以根据音频流所在的编解码器来选择兼容的输出容器?
\n我正在使用MacRuby 0.10和XCode 4,我在其中创建了一个默认的基于NSDocument的应用程序.但是,在构建和运行应用程序时,不会显示任何窗口,并且通常会禁用通常的菜单命令.
在创建常规的基于Cocoa的应用程序时,主应用程序窗口显示正常.
有谁知道修复是什么?
担;
audio ×2
c++ ×2
avasset ×1
avfoundation ×1
c ×1
callback ×1
cocoa ×1
core-audio ×1
ffmpeg ×1
inheritance ×1
libav ×1
libavcodec ×1
libavformat ×1
macos ×1
macruby ×1
swift ×1
templates ×1
wrapper ×1
xcode4 ×1