function UnaryStrided1dDispatchBy( table, idtypes, odtypes, policies ) {
	var dt;
	var i;
	if ( !( this instanceof UnaryStrided1dDispatchBy ) ) {
		return new UnaryStrided1dDispatchBy( table, idtypes, odtypes, policies );
	}
	if ( !isObject( table ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be an object. Value: `%s`.', table ) );
	}
	if ( !isFunction( table.default ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be an object having a "default" property and an associated method.' ) );
	}
	if ( hasProp( table, 'types' ) && !isCollection( table.types ) && !isEmptyCollection( table.types ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be an object having a "types" property whose associated value is an array-like object.' ) );
	}
	if ( hasProp( table, 'fcns' ) && !isFunctionArray( table.fcns ) && !isEmptyCollection( table.fcns ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be an object having a "fcns" property whose associated value is an array-like object containing functions.' ) );
	}
	if ( !isCollection( idtypes ) ) {
		throw new TypeError( format( 'invalid argument. Second argument must be an array-like object. Value: `%s`.', idtypes ) );
	}
	for ( i = 0; i < idtypes.length; i++ ) {
		dt = idtypes[ i ];
		if (
			!isCollection( dt ) ||
			dt.length < 1 ||
			!everyBy( dt, isDataType )
		) {
			throw new TypeError( format( 'invalid argument. Second argument must contain arrays of data types. Value: `%s`.', idtypes ) );
		}
	}
	if (
		!isCollection( odtypes ) ||
		odtypes.length < 1 ||
		!everyBy( odtypes, isDataType )
	) {
		throw new TypeError( format( 'invalid argument. Third argument must be an array of data types. Value: `%s`.', odtypes ) );
	}
	if ( !isObject( policies ) ) {
		throw new TypeError( format( 'invalid argument. Fourth argument must be an object. Value: `%s`.', table ) );
	}
	if ( !isOutputDataTypePolicy( policies.output ) ) {
		throw new TypeError( format( 'invalid argument. Fourth argument must be an object having a supported output data type policy. Value: `%s`.', policies.output ) );
	}
	if ( !isInputCastingPolicy( policies.casting ) ) {
		throw new TypeError( format( 'invalid argument. Fourth argument must be an object having a supported casting policy. Value: `%s`.', policies.casting ) );
	}
	this._table = {
		'default': table.default,
		'types': ( table.types ) ? types2enums( table.types ) : [], // note: convert to enums (i.e., integers) to ensure faster comparisons
		'fcns': ( table.fcns ) ? copy( table.fcns ) : []
	};
	if ( this._table.types.length !== this._table.fcns.length ) {
		throw new Error( 'invalid argument. First argument specifies an unexpected number of types. An input ndarray data type must be specified for each provided strided function.' );
	}
	this._idtypes = idtypes;
	this._odtypes = odtypes;
	this._policies = {
		'output': policies.output,
		'casting': policies.casting
	};
	return this;
}
Constructor for performing a reduction on an input ndarray according to a callback function.

@constructor
@param {Object} table - dispatch table
@param {Function} table.default - default strided reduction function
@param {StringArray} [table.types=[]] - one-dimensional list of ndarray data types describing specialized input ndarray argument signatures
@param {ArrayLikeObject<Function>} [table.fcns=[]] - list of strided reduction functions which are specific to specialized input ndarray argument signatures
@param {ArrayLikeObject<StringArray>} idtypes - list containing lists of supported input data types for each ndarray argument
@param {StringArray} odtypes - list of supported output data types
@param {Object} policies - policies
@param {string} policies.output - output data type policy
@param {string} policies.casting - input ndarray casting policy
@throws {TypeError} first argument must be an object having valid properties
@throws {TypeError} second argument must be an array containing arrays of supported data types
@throws {TypeError} third argument must be an array of supported data types
@throws {TypeError} fourth argument must be an object having supported policies
@throws {Error} first argument must be an object having valid properties
@returns {UnaryStrided1dDispatchBy} instance

@example
var base = require( '@stdlib/stats/base/ndarray/max-by' );
var dtypes = require( '@stdlib/ndarray/dtypes' );
var ndarray = require( '@stdlib/ndarray/base/ctor' );

var idt = dtypes( 'real_and_generic' );
var odt = idt;
var policies = {
    'output': 'same',
    'casting': 'none'
};

var table = {
    'default': base
};
var maxBy = new UnaryStrided1dDispatchBy( table, [ idt ], odt, policies );

var xbuf = [ -1.0, 2.0, -3.0 ];
var x = new ndarray( 'generic', xbuf, [ xbuf.length ], [ 1 ], 0, 'row-major' );

function clbk( v ) {
    return v * 2.0;
}

var y = maxBy.apply( x, clbk );
// returns <ndarray>

var v = y.get();
// returns 4.0